mcp-server-taxcode 1.2.0__tar.gz → 1.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/.github/dependabot.yml +5 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/.github/workflows/ci.yml +58 -5
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/.github/workflows/release.yml +3 -3
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/AGENTS.md +4 -4
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/CONTRIBUTING.md +11 -7
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/Dockerfile +14 -6
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/PKG-INFO +10 -9
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/README.md +5 -4
- mcp_server_taxcode-1.4.0/docker/build-backend.txt +26 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docker/pip-bootstrap.txt +3 -3
- mcp_server_taxcode-1.4.0/docker/uv-bootstrap.txt +26 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ca/caccr_17014.md +2 -2
- mcp_server_taxcode-1.4.0/docs/ca/llms-full.txt +174 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ca/rtc_17014.md +2 -2
- mcp_server_taxcode-1.4.0/docs/ca/rtc_17015.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ca/rtc_17016.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ca/rtc_17041.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ca/rtc_17041_i.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ca/rtc_17043.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ca/rtc_17043_2024.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ca/rtc_17052_10.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ca/rtc_17054.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ca/rtc_17062.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ca/rtc_17071.md +17 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ca/rtc_17951.md +2 -2
- mcp_server_taxcode-1.4.0/docs/ca/rtc_17952.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ca/rtc_17952_5.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ca/rtc_18001.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ca/rtc_18002.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ca/rtc_18662.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ca/rtc_19900.md +17 -0
- mcp_server_taxcode-1.4.0/docs/can/ita_114.md +40 -0
- mcp_server_taxcode-1.4.0/docs/can/ita_115.md +194 -0
- mcp_server_taxcode-1.4.0/docs/can/ita_117.md +72 -0
- mcp_server_taxcode-1.4.0/docs/can/ita_117_1.md +101 -0
- mcp_server_taxcode-1.4.0/docs/can/ita_117_2019.md +60 -0
- mcp_server_taxcode-1.4.0/docs/can/ita_117_2023.md +72 -0
- mcp_server_taxcode-1.4.0/docs/can/ita_118.md +403 -0
- mcp_server_taxcode-1.4.0/docs/can/ita_118_2019.md +305 -0
- mcp_server_taxcode-1.4.0/docs/can/ita_118_2020.md +371 -0
- mcp_server_taxcode-1.4.0/docs/can/ita_118_2023.md +371 -0
- mcp_server_taxcode-1.4.0/docs/can/ita_128_1.md +503 -0
- mcp_server_taxcode-1.4.0/docs/can/ita_153.md +308 -0
- mcp_server_taxcode-1.4.0/docs/can/ita_2.md +39 -0
- mcp_server_taxcode-1.4.0/docs/can/ita_212.md +989 -0
- mcp_server_taxcode-1.4.0/docs/can/ita_250.md +194 -0
- mcp_server_taxcode-1.4.0/docs/can/ita_38.md +71 -0
- mcp_server_taxcode-1.4.0/docs/can/itr_100.md +200 -0
- mcp_server_taxcode-1.4.0/docs/can/itr_102.md +146 -0
- mcp_server_taxcode-1.4.0/docs/can/itr_103.md +172 -0
- mcp_server_taxcode-1.4.0/docs/can/itr_105.md +30 -0
- mcp_server_taxcode-1.4.0/docs/can/itr_202.md +94 -0
- mcp_server_taxcode-1.4.0/docs/can/itr_2600.md +36 -0
- mcp_server_taxcode-1.4.0/docs/can/itr_2601.md +45 -0
- mcp_server_taxcode-1.4.0/docs/can/itr_805.md +26 -0
- mcp_server_taxcode-1.4.0/docs/can/llms-full.txt +4603 -0
- mcp_server_taxcode-1.4.0/docs/il/ilcs_5_1501_a_14.md +17 -0
- mcp_server_taxcode-1.4.0/docs/il/ilcs_5_1501_a_16.md +17 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/il/ilcs_5_1501_a_20.md +2 -2
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/il/ilcs_5_201.md +2 -2
- mcp_server_taxcode-1.4.0/docs/il/ilcs_5_201_p.md +17 -0
- mcp_server_taxcode-1.4.0/docs/il/ilcs_5_202.md +17 -0
- mcp_server_taxcode-1.4.0/docs/il/ilcs_5_203_a.md +17 -0
- mcp_server_taxcode-1.4.0/docs/il/ilcs_5_204.md +17 -0
- mcp_server_taxcode-1.4.0/docs/il/ilcs_5_208.md +17 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/il/ilcs_5_301.md +2 -2
- mcp_server_taxcode-1.4.0/docs/il/ilcs_5_302.md +17 -0
- mcp_server_taxcode-1.4.0/docs/il/ilcs_5_303.md +17 -0
- mcp_server_taxcode-1.4.0/docs/il/ilcs_5_304_a.md +17 -0
- mcp_server_taxcode-1.4.0/docs/il/ilcs_5_305.md +17 -0
- mcp_server_taxcode-1.4.0/docs/il/ilcs_5_601_b_3.md +17 -0
- mcp_server_taxcode-1.4.0/docs/il/ilcs_5_701.md +17 -0
- mcp_server_taxcode-1.4.0/docs/il/llms-full.txt +147 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/llms-full.txt +7 -6
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/llms.txt +99 -1
- mcp_server_taxcode-1.4.0/docs/ma/llms-full.txt +138 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ma/maconst_art__xliv.md +2 -2
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ma/mgl_62_1_f.md +2 -2
- mcp_server_taxcode-1.4.0/docs/ma/mgl_62_2.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ma/mgl_62_3_b_a_9.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ma/mgl_62_3_b_a_9_2022.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ma/mgl_62_3_b_b.md +17 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ma/mgl_62_4.md +2 -2
- mcp_server_taxcode-1.4.0/docs/ma/mgl_62_4_a.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ma/mgl_62_5a.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ma/mgl_62_6_a.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ma/mgl_62_6_h.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ma/mgl_62_6_k.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ma/mgl_62_6_x.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ma/mgl_62b_2.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ma/mgl_63d_2.md +17 -0
- mcp_server_taxcode-1.4.0/docs/nj/llms-full.txt +147 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/nj/njac_18_35_5_2.md +2 -2
- mcp_server_taxcode-1.4.0/docs/nj/njsa_54a_12_3.md +17 -0
- mcp_server_taxcode-1.4.0/docs/nj/njsa_54a_12_5.md +17 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/nj/njsa_54a_1_2.md +2 -2
- mcp_server_taxcode-1.4.0/docs/nj/njsa_54a_1_2_m/342/200/223_n.md +17 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/nj/njsa_54a_2_1.md +2 -2
- mcp_server_taxcode-1.4.0/docs/nj/njsa_54a_3_1.md +17 -0
- mcp_server_taxcode-1.4.0/docs/nj/njsa_54a_3a_17.md +17 -0
- mcp_server_taxcode-1.4.0/docs/nj/njsa_54a_4_1.md +17 -0
- mcp_server_taxcode-1.4.0/docs/nj/njsa_54a_4_1_1.md +17 -0
- mcp_server_taxcode-1.4.0/docs/nj/njsa_54a_5_1.md +17 -0
- mcp_server_taxcode-1.4.0/docs/nj/njsa_54a_5_2.md +17 -0
- mcp_server_taxcode-1.4.0/docs/nj/njsa_54a_5_8.md +17 -0
- mcp_server_taxcode-1.4.0/docs/nj/njsa_54a_5_8_2022.md +17 -0
- mcp_server_taxcode-1.4.0/docs/nj/njsa_54a_7_1.md +17 -0
- mcp_server_taxcode-1.4.0/docs/nj/njsa_54a_9_17_e.md +17 -0
- mcp_server_taxcode-1.4.0/docs/nm/nmsa_7_2_7.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ny/llms-full.txt +165 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ny/nycrr_105_20.md +2 -2
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ny/nycrr_132_18.md +2 -2
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ny/nytax_601.md +2 -2
- mcp_server_taxcode-1.4.0/docs/ny/nytax_601_d.md +17 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ny/nytax_605.md +2 -2
- mcp_server_taxcode-1.4.0/docs/ny/nytax_605_b_1_a.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ny/nytax_611.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ny/nytax_612.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ny/nytax_614.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ny/nytax_615.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ny/nytax_616.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ny/nytax_620.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ny/nytax_631.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ny/nytax_632.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ny/nytax_638.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ny/nytax_639.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ny/nytax_671.md +17 -0
- mcp_server_taxcode-1.4.0/docs/ny/nytax_861.md +17 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ok/68 o.s._2355.md +1 -1
- mcp_server_taxcode-1.4.0/docs/pr/ley60_6060_05.md +30 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/llms-full.txt +22 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/fastmcp.json +6 -5
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/pyproject.toml +14 -4
- mcp_server_taxcode-1.4.0/scripts/extract_canada_lims.py +113 -0
- mcp_server_taxcode-1.4.0/scripts/gen_build_backend.py +282 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/scripts/ingest_statutes.py +9 -1
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/skills/taxcode-mcp/SKILL.md +2 -2
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/catalog.py +911 -74
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/federal/standard_deduction.json +24 -8
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/jurisdictions.json +2 -1
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/manifest/ak.json +5 -5
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/al.json +351 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/ar.json +355 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/az.json +246 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/ca.json +689 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/can.json +1006 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/manifest/co.json +11 -1
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/manifest/ct.json +18 -5
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/manifest/dc.json +13 -1
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/manifest/de.json +16 -1
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/ga.json +553 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/hi.json +127 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/ia.json +382 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/manifest/id.json +20 -13
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/il.json +275 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/manifest/in.json +16 -1
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/ks.json +257 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/ky.json +305 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/la.json +201 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/ma.json +286 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/md.json +387 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/me.json +104 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/mi.json +239 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/mn.json +230 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/mo.json +200 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/ms.json +372 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/mt.json +137 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/nc.json +137 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/manifest/nd.json +14 -1
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/ne.json +371 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/nh.json +160 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/nj.json +255 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/nm.json +123 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/nv.json +33 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/ny.json +322 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/oh.json +237 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/ok.json +58 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/or.json +139 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/manifest/pa.json +1 -1
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/manifest/pr.json +13 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/manifest/ri.json +43 -1
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/sc.json +152 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/manifest/sd.json +5 -5
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/manifest/tn.json +6 -6
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/manifest/us.json +24 -8
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/ut.json +176 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/va.json +152 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/vt.json +443 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/manifest/wa.json +53 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/wi.json +205 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/manifest/wv.json +108 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/manifest/wy.json +5 -5
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/publications/can.json +51 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/rates/ak.json +1 -1
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/al.json +108 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/ar.json +284 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/az.json +78 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/ca.json +635 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/can.json +272 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/rates/co.json +6 -1
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/ct.json +1976 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/rates/dc.json +16 -3
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/rates/de.json +17 -1
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/ga.json +277 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/hi.json +616 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/ia.json +359 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/rates/id.json +30 -6
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/il.json +41 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/rates/in.json +10 -2
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/ks.json +169 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/ky.json +106 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/la.json +143 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/ma.json +56 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/md.json +466 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/me.json +151 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/mi.json +73 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/mn.json +327 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/mo.json +372 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/ms.json +572 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/mt.json +167 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/nc.json +69 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/nd.json +43 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/ne.json +372 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/nh.json +32 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/nj.json +578 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/nm.json +275 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/rates/nv.json +1 -1
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/ny.json +1071 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/oh.json +334 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/ok.json +128 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/or.json +182 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/rates/ri.json +45 -7
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/sc.json +135 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/rates/sd.json +1 -1
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/rates/tn.json +1 -1
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/ut.json +103 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/rates/va.json +47 -3
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/vt.json +524 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/rates/wa.json +3 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/wi.json +160 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/rates/wv.json +159 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/rates/wy.json +1 -1
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/statutes/ca.json +435 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/statutes/can.json +4953 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/statutes/il.json +372 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/statutes/ma.json +343 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/statutes/nj.json +369 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/nm.json +1 -1
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/data/statutes/ny.json +419 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/ok.json +1 -1
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/pr.json +37 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/db.py +129 -22
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/disclaimers.py +61 -2
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/paging.py +11 -7
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/tools/canada.py +452 -0
- mcp_server_taxcode-1.4.0/src/taxcode_mcp/tools/compliance.py +2473 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/tools/statutes.py +27 -7
- mcp_server_taxcode-1.4.0/tests/fixtures/compliance_golden/compliance_evaluate_georgia_residency.jsonl.gz +0 -0
- mcp_server_taxcode-1.4.0/tests/fixtures/compliance_golden/compliance_evaluate_state_residency.jsonl.gz +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/fixtures/prior_years/corrected_answers.json +116 -7
- mcp_server_taxcode-1.4.0/tests/fixtures/wave1/existing_rows.json +19 -0
- mcp_server_taxcode-1.4.0/tests/fixtures/wave1/searches.json +953 -0
- mcp_server_taxcode-1.4.0/tests/fixtures/wave1/sources.json +337 -0
- mcp_server_taxcode-1.4.0/tests/test_al_md_ca_data_fixes.py +126 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_batch.py +7 -1
- mcp_server_taxcode-1.4.0/tests/test_build_backend_lock.py +325 -0
- mcp_server_taxcode-1.4.0/tests/test_canada_federal.py +908 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_catalog.py +644 -71
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_compliance_golden.py +2 -1
- mcp_server_taxcode-1.4.0/tests/test_ct_md_edges.py +107 -0
- mcp_server_taxcode-1.4.0/tests/test_dependents_spouse_inputs.py +142 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_dockerfile.py +76 -6
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_e2e_live.py +2 -1
- mcp_server_taxcode-1.4.0/tests/test_fastmcp_json_floor.py +75 -0
- mcp_server_taxcode-1.4.0/tests/test_filing_status.py +212 -0
- mcp_server_taxcode-1.4.0/tests/test_hoh_mfs.py +255 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_ingest.py +5 -5
- mcp_server_taxcode-1.4.0/tests/test_mfs_spouse_la_credit_sc.py +647 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_paging.py +9 -5
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_prior_years.py +13 -1
- mcp_server_taxcode-1.4.0/tests/test_prior_years_pin.py +706 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_rate_prose.py +19 -17
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_rate_tables.py +797 -113
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_search_snippets.py +30 -19
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_server.py +146 -66
- mcp_server_taxcode-1.4.0/tests/test_statute_section_slash.py +62 -0
- mcp_server_taxcode-1.4.0/tests/test_undated_current_rows.py +68 -0
- mcp_server_taxcode-1.4.0/tests/test_wave1_state_statutes.py +201 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/uv.lock +448 -231
- mcp_server_taxcode-1.2.0/docker/uv-bootstrap.txt +0 -26
- mcp_server_taxcode-1.2.0/docs/ca/llms-full.txt +0 -37
- mcp_server_taxcode-1.2.0/docs/ca/rtc_17041.md +0 -17
- mcp_server_taxcode-1.2.0/docs/il/llms-full.txt +0 -28
- mcp_server_taxcode-1.2.0/docs/ma/llms-full.txt +0 -28
- mcp_server_taxcode-1.2.0/docs/nj/llms-full.txt +0 -28
- mcp_server_taxcode-1.2.0/docs/nm/nmsa_7_2_7.md +0 -17
- mcp_server_taxcode-1.2.0/docs/ny/llms-full.txt +0 -37
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/al.json +0 -32
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ar.json +0 -32
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/az.json +0 -45
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ca.json +0 -71
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ga.json +0 -160
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/hi.json +0 -32
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ia.json +0 -32
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/il.json +0 -58
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ks.json +0 -32
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ky.json +0 -77
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/la.json +0 -45
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ma.json +0 -100
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/md.json +0 -71
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/me.json +0 -32
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/mi.json +0 -32
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/mn.json +0 -32
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/mo.json +0 -32
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ms.json +0 -164
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/mt.json +0 -32
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/nc.json +0 -45
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ne.json +0 -138
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/nh.json +0 -32
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/nj.json +0 -58
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/nm.json +0 -32
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/nv.json +0 -32
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ny.json +0 -71
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/oh.json +0 -102
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ok.json +0 -32
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/or.json +0 -32
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/sc.json +0 -32
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ut.json +0 -88
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/va.json +0 -71
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/vt.json +0 -32
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/wi.json +0 -32
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/wv.json +0 -32
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/al.json +0 -44
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ar.json +0 -18
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/az.json +0 -13
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ca.json +0 -50
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ct.json +0 -50
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ga.json +0 -53
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/hi.json +0 -118
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ia.json +0 -46
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/il.json +0 -13
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ks.json +0 -36
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ky.json +0 -20
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/la.json +0 -50
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ma.json +0 -29
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/md.json +0 -49
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/me.json +0 -44
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/mi.json +0 -15
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/mn.json +0 -52
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/mo.json +0 -84
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ms.json +0 -174
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/mt.json +0 -36
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/nc.json +0 -29
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/nd.json +0 -25
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ne.json +0 -214
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/nh.json +0 -12
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/nj.json +0 -50
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/nm.json +0 -63
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ny.json +0 -58
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/oh.json +0 -110
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ok.json +0 -68
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/or.json +0 -53
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/sc.json +0 -44
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ut.json +0 -27
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/vt.json +0 -52
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/wi.json +0 -52
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/wv.json +0 -60
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/statutes/ca.json +0 -96
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/statutes/il.json +0 -73
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/statutes/ma.json +0 -73
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/statutes/nj.json +0 -73
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/statutes/ny.json +0 -95
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/tools/compliance.py +0 -1112
- mcp_server_taxcode-1.2.0/tests/fixtures/compliance_golden/compliance_evaluate_georgia_residency.jsonl.gz +0 -0
- mcp_server_taxcode-1.2.0/tests/fixtures/compliance_golden/compliance_evaluate_state_residency.jsonl.gz +0 -0
- mcp_server_taxcode-1.2.0/tests/test_prior_years_pin.py +0 -335
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/.github/CODEOWNERS +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/.github/workflows/dependabot-automerge.yml +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/.gitignore +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/CHANGELOG.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/CODE_OF_CONDUCT.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/LICENSE +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/SECURITY.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/conformance-baseline.yml +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ak/alaska stat._43_05_080.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ak/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/al/ala. code_40_18_2.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/al/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ar/a.c.a._26_51_201.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ar/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/az/a.r.s._43_1011.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/az/a.r.s._43_104.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/az/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/co/c.r.s._39_22_103.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/co/c.r.s._39_22_104.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/co/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ct/c.g.s._12_700.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ct/c.g.s._12_701.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ct/c.g.s._12_711.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ct/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/dc/d.c. code_47_1806_03.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/dc/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/de/del. code_1102.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/de/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/fl/flconst_art__vii_sec__5.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/fl/flstat_196_031.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/fl/flstat_222_17.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/fl/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ga/gareg_560_7_3__01.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ga/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ga/ocga_48_7_1.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ga/ocga_48_7_20.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ga/ocga_48_7_20_2024.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ga/ocga_48_7_20_2025.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ga/ocga_48_7_27.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ga/ocga_48_7_30.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/hi/hrs_235_51.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/hi/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ia/iowa code_422_5.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ia/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/id/idaho code_63_3024.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/id/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/in/ind. code_6_3_2_1.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/in/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ks/k.s.a._79_32,110.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ks/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ky/krs_141_020.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ky/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/la/la. r.s._47_32.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/la/la. r.s._47_32_2022.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/la/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/md/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/md/md. code_10_101.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/md/md. code_10_105.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/md/md. code_10_106.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/me/36 m.r.s._5111.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/me/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/mi/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/mi/mcl_206_51.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/mn/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/mn/minn. stat._290_06.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/mo/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/mo/rsmo_143_011.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ms/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ms/miss. code_27_7_5.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/mt/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/mt/mca_15_30_2103.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/nc/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/nc/n.c.g.s._105_153_3.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/nc/n.c.g.s._105_153_7.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/nd/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/nd/n.d.c.c._57_38_30_3.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ne/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ne/neb. rev. stat._77_2715_03.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/nh/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/nh/rsa_77_1_2024.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/nm/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/nv/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/nv/nev. const._art__10,_/302/247_1.md" +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/oh/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/oh/r.c._5747_02.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/oh/r.c._5747_24.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ok/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/or/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/or/ors_316_037.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pa/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pa/p.s._7301.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pa/p.s._7302.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pa/pa. code_109_8.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/cri_1010_01.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/cri_1031_01.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/cri_1031_02.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/cri_1031_02_2019.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/cri_1062_01.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/cri_1062_01_2019.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/cri_1062_03.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/cri_1062_03_2019.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley22_3_2012.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley60_1020_02.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley60_1020_02_2019.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley60_1020_02_2020.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley60_2021_01.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley60_2022_01.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley60_2022_01_2019.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley60_2022_02.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley60_2022_02_2019.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley60_2031_01.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley60_2032_01.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley60_6020_03.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley60_6020_03_2019.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley60_6020_10.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley60_6020_10_2019.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley60_6020_10_2020.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley60_6020_10_2022.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley60_6020_10_2024.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley60_6020_10_2025.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/pr/ley60_6070_55.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ri/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ri/r.i.g.l._44_30_1.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/sc/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/sc/s.c. code_12_6_510.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/sd/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/sd/s.d. const._art__xi,_/302/247_2.md" +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/tn/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/tn/tenn. const._art__ii,_/302/247_28.md" +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/tx/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/tx/txconst_art__viii_sec__24_a.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/tx/txtax_171_001.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/cfr_1_937_1.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/cfr_1_937_2.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/cfr_1_937_3.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/cfr_1_937_3_2019.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_1.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_1411.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_1_2019.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_1_2020.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_24.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_24_2019.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_24_2021.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_32.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_32_2019.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_6012.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_61.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_62.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_62_2019.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_62_2020.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_62_2021.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_63.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_63_2019.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_63_2021.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_6688.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_865.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_911.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_933.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_937.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/irc_957.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/us/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ut/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/ut/utah code_59_10_104.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/va/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/va/va. code_58_1_302.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/va/va. code_58_1_320.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/va/va. code_58_1_342.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/vt/32 v.s.a._5822.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/vt/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/wa/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/wa/rcw_82_87_020.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/wa/rcw_82_87_040.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/wa/waconst_art__vii_sec__1.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/wi/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/wi/wis. stat._71_06.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/wv/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/wv/w. va. code_11_21_4e.md +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/wy/llms-full.txt +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/docs/wy/wyo. const._art__15,_/302/247_18.md" +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/scripts/build_catalog.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/scripts/build_corrected_pins.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/scripts/build_prior_years_pins.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/scripts/check_conformance.sh +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/scripts/check_openapi_drift.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/scripts/check_tool_contract.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/scripts/check_version.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/scripts/release_notes.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/scripts/setup_repo_governance.sh +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/server.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/__init__.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/auth.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/client.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/config.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/manifest/fl.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/manifest/tx.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/publications/ga.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/publications/md.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/publications/oh.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/publications/pa.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/publications/pr.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/publications/us.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/publications/va.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/rates/pa.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/ak.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/al.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/ar.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/az.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/co.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/ct.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/dc.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/de.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/fl.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/ga.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/hi.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/ia.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/id.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/in.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/ks.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/ky.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/la.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/md.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/me.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/mi.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/mn.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/mo.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/ms.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/mt.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/nc.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/nd.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/ne.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/nh.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/nv.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/oh.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/or.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/pa.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/ri.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/sc.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/sd.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/tn.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/tx.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/us.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/ut.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/va.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/vt.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/wa.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/wi.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/wv.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/data/statutes/wy.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/errors.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/middleware.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/profiles.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/server.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/ssrf.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/tools/__init__.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/src/taxcode_mcp/tools/system.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/conftest.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/fake_network.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/fixtures/compliance_golden/compliance_calculate_built_in_gain_sourcing.jsonl.gz +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/fixtures/compliance_golden/compliance_cross_border_tax_analysis.jsonl.gz +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/fixtures/compliance_golden/compliance_evaluate_pr_bona_fide_residency.jsonl.gz +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/fixtures/compliance_golden/constants.json +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/fixtures/prior_years/f4f0d5d_pins.json.gz +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/fixtures/usc26_sample.xml +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/golden_compliance.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_check_version.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_client.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_code_mode_extra.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_config.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_conftest_auth_env.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_db.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_disclaimers.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_drift.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_errors.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_federal.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_http_auth.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_layered.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_network_guard.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_notfound_pointer.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_otel_spans.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_prior_years_pr.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_profiles.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_protocol.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_release_notes.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_search_normalize.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_ssrf.py +0 -0
- {mcp_server_taxcode-1.2.0 → mcp_server_taxcode-1.4.0}/tests/test_version.py +0 -0
|
@@ -2,6 +2,11 @@ version: 2
|
|
|
2
2
|
updates:
|
|
3
3
|
- package-ecosystem: "uv"
|
|
4
4
|
directory: "/"
|
|
5
|
+
# Generated from uv.lock by scripts/gen_build_backend.py. The uv scan treats
|
|
6
|
+
# requirements-shaped *.txt files as pip manifests, so ignore this one.
|
|
7
|
+
# Lock bumps still land in uv.lock; regenerate the file with the script.
|
|
8
|
+
exclude-paths:
|
|
9
|
+
- "docker/build-backend.txt"
|
|
5
10
|
schedule:
|
|
6
11
|
interval: "weekly"
|
|
7
12
|
day: "sunday"
|
|
@@ -40,7 +40,7 @@ jobs:
|
|
|
40
40
|
persist-credentials: false
|
|
41
41
|
|
|
42
42
|
- name: Install uv
|
|
43
|
-
uses: astral-sh/setup-uv@
|
|
43
|
+
uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
44
44
|
with:
|
|
45
45
|
# Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
|
|
46
46
|
# FastMCP's October 2026 certificate authority incident notice).
|
|
@@ -78,7 +78,7 @@ jobs:
|
|
|
78
78
|
persist-credentials: false
|
|
79
79
|
|
|
80
80
|
- name: Install uv
|
|
81
|
-
uses: astral-sh/setup-uv@
|
|
81
|
+
uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
82
82
|
with:
|
|
83
83
|
# Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
|
|
84
84
|
# FastMCP's October 2026 certificate authority incident notice).
|
|
@@ -110,7 +110,7 @@ jobs:
|
|
|
110
110
|
persist-credentials: false
|
|
111
111
|
|
|
112
112
|
- name: Install uv
|
|
113
|
-
uses: astral-sh/setup-uv@
|
|
113
|
+
uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
114
114
|
with:
|
|
115
115
|
# Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
|
|
116
116
|
# FastMCP's October 2026 certificate authority incident notice).
|
|
@@ -154,7 +154,7 @@ jobs:
|
|
|
154
154
|
persist-credentials: false
|
|
155
155
|
|
|
156
156
|
- name: Install uv
|
|
157
|
-
uses: astral-sh/setup-uv@
|
|
157
|
+
uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
158
158
|
with:
|
|
159
159
|
# Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
|
|
160
160
|
# FastMCP's October 2026 certificate authority incident notice).
|
|
@@ -203,6 +203,59 @@ jobs:
|
|
|
203
203
|
fi
|
|
204
204
|
echo "Image label matches ${EXPECTED}"
|
|
205
205
|
|
|
206
|
+
- name: Runtime image has the project and no build backend
|
|
207
|
+
# The builder installs the build backend to /tmp/build-backend, outside the venv the
|
|
208
|
+
# runtime stage copies, so no build-only package from docker/build-backend.txt may be
|
|
209
|
+
# in the image. packaging is left out on purpose: fastmcp-slim needs it at runtime
|
|
210
|
+
# (uv.lock).
|
|
211
|
+
run: |
|
|
212
|
+
PROJECT="$(grep -m 1 '^name = ' pyproject.toml | cut -d '"' -f 2)"
|
|
213
|
+
docker run --rm --entrypoint pip mcp-server-ci:test show "$PROJECT" > /dev/null
|
|
214
|
+
for pkg in hatchling uv-dynamic-versioning dunamai trove-classifiers tomlkit jinja2 \
|
|
215
|
+
MarkupSafe pathspec pluggy; do
|
|
216
|
+
if docker run --rm --entrypoint pip mcp-server-ci:test show "$pkg" > /dev/null 2>&1; then
|
|
217
|
+
echo "::error::build backend package $pkg is in the runtime image"
|
|
218
|
+
exit 1
|
|
219
|
+
fi
|
|
220
|
+
done
|
|
221
|
+
echo "Runtime image has $PROJECT and no build backend"
|
|
222
|
+
|
|
223
|
+
- name: Image serves MCP over stdio
|
|
224
|
+
# Starts the runtime image on its default stdio transport with no network, sends
|
|
225
|
+
# initialize, notifications/initialized and tools/list, and holds stdin open until
|
|
226
|
+
# the tools/list reply arrives so the check does not depend on shutdown-on-EOF timing.
|
|
227
|
+
# Replies are matched by JSON-RPC id, not by line order, and every non-empty stdout line
|
|
228
|
+
# must parse as exactly one JSON-RPC 2.0 message (stdio is newline-delimited).
|
|
229
|
+
run: |
|
|
230
|
+
set -euo pipefail
|
|
231
|
+
IN="$RUNNER_TEMP/mcp-in"
|
|
232
|
+
OUT="$RUNNER_TEMP/mcp-out"
|
|
233
|
+
mkfifo "$IN"
|
|
234
|
+
: > "$OUT"
|
|
235
|
+
timeout --kill-after=5 60 docker run -i --rm --network none mcp-server-ci:test < "$IN" > "$OUT" &
|
|
236
|
+
SERVER=$!
|
|
237
|
+
exec 3> "$IN"
|
|
238
|
+
MESSAGES='split("\n") | map(select(length > 0) | fromjson | if type == "object" and .jsonrpc == "2.0" then . else error("stdout line is not a JSON-RPC 2.0 message") end)'
|
|
239
|
+
wait_for_id() {
|
|
240
|
+
for _ in $(seq 1 150); do
|
|
241
|
+
if jq -Rse --argjson id "$1" "$MESSAGES | any(.[]; .id == \$id)" "$OUT" > /dev/null 2>&1; then
|
|
242
|
+
return 0
|
|
243
|
+
fi
|
|
244
|
+
sleep 0.2
|
|
245
|
+
done
|
|
246
|
+
echo "No reply with id $1 within 30s"; cat "$OUT"; exit 1
|
|
247
|
+
}
|
|
248
|
+
printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"ci-smoke","version":"0"}}}' >&3
|
|
249
|
+
wait_for_id 1
|
|
250
|
+
printf '%s\n' '{"jsonrpc":"2.0","method":"notifications/initialized"}' >&3
|
|
251
|
+
printf '%s\n' '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' >&3
|
|
252
|
+
wait_for_id 2
|
|
253
|
+
exec 3>&-
|
|
254
|
+
wait "$SERVER"
|
|
255
|
+
jq -Rse "$MESSAGES"' | map(select(.id == 1)) | length == 1 and .[0].result.protocolVersion == "2025-11-25"' "$OUT"
|
|
256
|
+
jq -Rse "$MESSAGES"' | map(select(.id == 2)) | length == 1 and (.[0].result.tools | type == "array" and length > 0)' "$OUT"
|
|
257
|
+
echo "Image answered initialize and tools/list over stdio"
|
|
258
|
+
|
|
206
259
|
- name: Builder fails below the ca-certificates floor
|
|
207
260
|
# Raising CA_CERTIFICATES_FLOOR above any real Debian version makes the installed
|
|
208
261
|
# package older than the floor, whatever version the base image or trixie-security
|
|
@@ -243,7 +296,7 @@ jobs:
|
|
|
243
296
|
persist-credentials: false
|
|
244
297
|
|
|
245
298
|
- name: Install uv
|
|
246
|
-
uses: astral-sh/setup-uv@
|
|
299
|
+
uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
247
300
|
with:
|
|
248
301
|
# Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
|
|
249
302
|
# FastMCP's October 2026 certificate authority incident notice).
|
|
@@ -26,7 +26,7 @@ jobs:
|
|
|
26
26
|
persist-credentials: false
|
|
27
27
|
|
|
28
28
|
- name: Install uv
|
|
29
|
-
uses: astral-sh/setup-uv@
|
|
29
|
+
uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
30
30
|
with:
|
|
31
31
|
# Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
|
|
32
32
|
# FastMCP's October 2026 certificate authority incident notice).
|
|
@@ -97,7 +97,7 @@ jobs:
|
|
|
97
97
|
uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3
|
|
98
98
|
|
|
99
99
|
- name: Create GitHub Release
|
|
100
|
-
uses: softprops/action-gh-release@
|
|
100
|
+
uses: softprops/action-gh-release@8a0cd651e5b2365bd640854a3fa5dfc70e4875f3 # v3.0.4
|
|
101
101
|
with:
|
|
102
102
|
files: |
|
|
103
103
|
dist/*.whl
|
|
@@ -122,7 +122,7 @@ jobs:
|
|
|
122
122
|
persist-credentials: false
|
|
123
123
|
|
|
124
124
|
- name: Log in to GitHub Container Registry
|
|
125
|
-
uses: docker/login-action@
|
|
125
|
+
uses: docker/login-action@8aa5831fb8d48d8f76594c7ddde61ae58019f550 # v4.8.0
|
|
126
126
|
with:
|
|
127
127
|
registry: ghcr.io
|
|
128
128
|
username: ${{ github.actor }}
|
|
@@ -46,7 +46,7 @@ Host configuration JSON for these doc servers (`mcp_config.json` and other deskt
|
|
|
46
46
|
- `src/<name>_mcp/client.py` — async HTTP client; `ssrf.py` — SSRF / DNS-rebinding guard; `errors.py` — exceptions and secret redaction; `middleware.py` — parent and child middleware; `config.py` — settings.
|
|
47
47
|
- `src/taxcode_mcp/data/` — the single source of truth for statute and publication rows: `jurisdictions.json` (catalog order), `statutes/<code>.json`, `publications/<code>.json`, `manifest/<code>.json` (one source record per row), and `rates/<code>.json` (the compliance tools' rate tables, one per state in `RATE_TABLE_MODELS`). `src/taxcode_mcp/catalog.py` loads and validates them; `db.py` seeds DuckDB from the rows, and `tools/compliance.py` reads every rate from the rate tables. Row layout, manifest fields and how to add a row: `CONTRIBUTING.md` (Adding or changing a row).
|
|
48
48
|
- `scripts/build_catalog.py` — rewrites the data files in canonical form and generates `docs/<code>/*.md`, `docs/<code>/llms-full.txt` (one jurisdiction's full text), `docs/llms.txt` and `docs/llms-full.txt` (the index of the per-jurisdiction files) from them; `--check` (run in CI and by `tests/test_catalog.py`) fails on a schema or canonical-form error (rate tables included, and a missing or stray rate table), an incomplete or mismatched manifest entry, or docs that differ from the generated output. Never edit generated docs by hand.
|
|
49
|
-
- `src/taxcode_mcp/paging.py` — hard response cap (32,000 characters of JSON) and paging for the statutes tools: `statutes_lookup_statute` pages long text (`page_cursor` / `next_cursor`), search and publications clamp `limit` to 1..25 items per call (`offset` / `next_offset`), and the `taxcode://statutes/{jurisdiction}/{section}{?page_cursor}` resource returns the same 8,000-character pages, ending a non-final page with the full URI of the next one (`...?page_cursor=`). The template has no `statutes/` segment of its own: the `statutes` mount namespace supplies it.
|
|
49
|
+
- `src/taxcode_mcp/paging.py` — hard response cap (32,000 characters of JSON) and paging for the statutes tools: `statutes_lookup_statute` pages long text (`page_cursor` / `next_cursor`), search and publications clamp `limit` to 1..25 items per call (`offset` / `next_offset`), and the `taxcode://statutes/{jurisdiction}/{section*}{?page_cursor}` resource returns the same 8,000-character pages, ending a non-final page with the full URI of the next one (`...?page_cursor=`). The template has no `statutes/` segment of its own: the `statutes` mount namespace supplies it.
|
|
50
50
|
- `scripts/check_tool_contract.py` — source of truth for the expected tool set and annotations. Do not hard-code tool counts elsewhere.
|
|
51
51
|
- `scripts/check_openapi_drift.py`, `scripts/check_conformance.sh` + `conformance-baseline.yml` — drift and protocol conformance.
|
|
52
52
|
- `tests/` — offline unit, layered-composition, and protocol tests; `test_e2e_live.py` is opt-in (`-m e2e`).
|
|
@@ -139,10 +139,10 @@ When translating an API documentation page, `llm.txt`, or OpenAPI specification
|
|
|
139
139
|
- Tool execution errors reach the client as `tools/call` results with `isError: true` and the redacted message (`tool_error`, raised `from None` after the `except` block ends, so neither `__cause__` nor `__context__` holds the original exception); `ParentAuditMiddleware` logs the same redacted message. A batch tool's per-item errors and its `batch_failed` error (`tool_failure`, raised `from None` outside any `except` block) carry redacted messages too.
|
|
140
140
|
- An unknown tool stays FastMCP 4.0.11's tool result (`isError: true`). The spec's JSON-RPC `-32602` (`Unknown tool: invalid_tool_name`) is a known gap; do not change the wire format. See `COOKBOOK.md` Recipe 12.
|
|
141
141
|
3. **Multi-Stage Non-Root Containers**:
|
|
142
|
-
- The `Dockerfile` must use a multi-stage build (`python:3.14-slim AS builder` $\rightarrow$ runtime, pulled from Docker Hub and pinned by digest) creating and executing under non-root `USER mcp` with virtual environment `/opt/venv`. The runtime stage carries `LABEL io.modelcontextprotocol.server.name` equal to the `server.json` `name` (MCP Registry OCI ownership check), and the default command stays stdio.
|
|
142
|
+
- The `Dockerfile` must use a multi-stage build (`python:3.14-slim-trixie AS builder` $\rightarrow$ runtime, pulled from Docker Hub and pinned by digest (both stages share the same pin); glibc is keyed by the Debian release in the tag, not the digest) creating and executing under non-root `USER mcp` with virtual environment `/opt/venv`. The runtime stage carries `LABEL io.modelcontextprotocol.server.name` equal to the `server.json` `name` (MCP Registry OCI ownership check), and the default command stays stdio.
|
|
143
143
|
- Trust stores follow FastMCP's [certificate authority incident notice (October 2026)](https://github.com/PrefectHQ/fastmcp/blob/main/SECURITY.md#certificate-authority-incident-october-2026): both stages upgrade the OS `ca-certificates` package and fail the build below the patched Debian version (`ARG CA_CERTIFICATES_FLOOR`, declared once), the builder does so before any pip runs because pip trusts the OS store as well as its bundled certifi, the builder bootstraps pip 26.2.2, and `certifi>=2026.10.19` is a direct dependency. `tests/test_dockerfile.py` and CI's `docker-build` job enforce the order and the floor.
|
|
144
144
|
- The pip bootstrap is hash-pinned in `docker/pip-bootstrap.txt` and installed with `--require-hashes`, so it does not depend on the TLS trust of the base image's older pip and certifi; whoever raises the pip floor updates that pin and its sha256 from PyPI (`https://pypi.org/pypi/pip/<version>/json`, the `py3-none-any` wheel's `digests.sha256`), because Dependabot does not track the file.
|
|
145
|
-
- Runtime dependencies install from `uv.lock`, so the image runs the versions CI tests: the builder installs uv from `docker/uv-bootstrap.txt` (hash-pinned, `--require-hashes`, into `/tmp/uv` outside the venv, so the runtime image has no uv), runs `uv export --locked --no-dev --no-emit-project --format requirements.txt` (base dependencies only, a hash for every package, and the build fails if `uv.lock` is stale), installs that file with pip in hash-checking mode, then installs the project with `pip install --no-deps .`. Never install the project with its dependencies (`pip install .`), which resolves them fresh at build time. Dependabot's weekly `uv` updates bump the uv pin and rewrite its sha256 values, writing one for every wheel and the sdist published for that version. Whoever changes `[tool.uv] required-version` keeps the uv pin within it, and a hand bump takes a sha256 for every wheel and the sdist from `https://pypi.org/pypi/uv/<version>/json` (`digests.sha256`); the manylinux x86_64 and aarch64 wheels are the ones the image build installs. `tests/test_dockerfile.py` enforces the install steps and the
|
|
145
|
+
- Runtime dependencies install from `uv.lock`, so the image runs the versions CI tests: the builder installs uv from `docker/uv-bootstrap.txt` (hash-pinned, `--require-hashes`, into `/tmp/uv` outside the venv, so the runtime image has no uv), runs `uv export --locked --no-dev --no-emit-project --format requirements.txt` (base dependencies only, a hash for every package, and the build fails if `uv.lock` is stale), installs that file with pip in hash-checking mode, then installs the project build backend from `docker/build-backend.txt` (hash-pinned hatchling, uv-dynamic-versioning, and every transitive build dependency, `--require-hashes --only-binary=:all:`, into `/tmp/build-backend` outside the venv, so the runtime image has no build backend) and the project with `PYTHONPATH=/tmp/build-backend pip install --no-deps --no-build-isolation .`. Never install the project with its dependencies (`pip install .`), which resolves them fresh at build time. Dependabot's weekly `uv` updates bump the uv pin and rewrite its sha256 values, writing one for every wheel and the sdist published for that version. Whoever changes `[tool.uv] required-version` keeps the uv pin within it, and a hand bump takes a sha256 for every wheel and the sdist from `https://pypi.org/pypi/uv/<version>/json` (`digests.sha256`); the manylinux x86_64 and aarch64 wheels are the ones the image build installs. The build-backend pins are the `build-backend` dependency group in `pyproject.toml` (exact versions inside the `[build-system]` ranges, not installed by default), so `uv.lock` carries their closure with hashes. After `uv lock`, `uv run python scripts/gen_build_backend.py` rewrites `docker/build-backend.txt` from `uv.lock` (`--check` reports drift instead), and `tests/test_build_backend_lock.py` fails if the file, the lock or the ranges disagree. The file is generated from `uv.lock` by `scripts/gen_build_backend.py`, must never be edited by hand, and the `uv` Dependabot entry excludes it via `exclude-paths`. `tests/test_dockerfile.py` enforces the install steps and the pins.
|
|
146
146
|
- Lowering `CA_CERTIFICATES_FLOOR` with `--build-arg` is unsupported; the build-arg exists only so CI can raise it for the negative floor check, and CI and the release workflow never pass it otherwise.
|
|
147
147
|
4. **Registry Metadata Constraint**:
|
|
148
148
|
- In `server.json`, the root `description` must be **strictly $\le$ 100 characters** to pass MCP Registry schema validation (longer strings trigger HTTP 422 errors).
|
|
@@ -211,6 +211,6 @@ coderabbit review --agent --uncommitted
|
|
|
211
211
|
|
|
212
212
|
## 🔄 CI & Releases
|
|
213
213
|
|
|
214
|
-
CI is defined in `.github/workflows/ci.yml` (jobs: `lint-and-types`, `test` on Python 3.11–3.14, `tool-contract`, `build-check`, `docker-build` (builds the image without pushing, checks its MCP server-name label against `server.json`, and checks that the builder stage fails at its `ca-certificates` floor check, before any pip step, when the floor is above the installed version), and `drift-check` (the same OpenAPI drift check as its own job; scheduled and manual runs only)). It runs on pushes and pull requests to `main`, weekly on `main` on Sunday at 15:53 America/New_York (`schedule` with `timezone`, after the Sunday 09:30 America/New_York Dependabot run in `.github/dependabot.yml`), and on manual dispatch (`workflow_dispatch`); the weekly run exists because merges by `dependabot-automerge.yml` use `GITHUB_TOKEN`, and pushes made with `GITHUB_TOKEN` don't trigger push workflows, so those merges get no `push` run. Run the commands above before opening a PR. `dependabot-automerge.yml` turns on squash auto-merge only for Dependabot PRs whose highest update is minor or patch; major updates wait for a human review. Docker base image updates (`package-ecosystem` `docker`) never auto-merge and always wait for a human review: Dependabot's docker ecosystem can move the image tag, not just its digest (for example `python:3.12-slim` to `python:3.14-slim`, a Python runtime upgrade that Dependabot labels a minor update), so the job logs a notice and leaves the PR open.
|
|
214
|
+
CI is defined in `.github/workflows/ci.yml` (jobs: `lint-and-types`, `test` on Python 3.11–3.14, `tool-contract`, `build-check`, `docker-build` (builds the image without pushing, checks its MCP server-name label against `server.json`, checks that the runtime image has the project and none of the build-only packages (runtime dependencies such as `packaging` stay), checks that the image answers `initialize` and `tools/list` over stdio with no network, and checks that the builder stage fails at its `ca-certificates` floor check, before any pip step, when the floor is above the installed version), and `drift-check` (the same OpenAPI drift check as its own job; scheduled and manual runs only)). It runs on pushes and pull requests to `main`, weekly on `main` on Sunday at 15:53 America/New_York (`schedule` with `timezone`, after the Sunday 09:30 America/New_York Dependabot run in `.github/dependabot.yml`), and on manual dispatch (`workflow_dispatch`); the weekly run exists because merges by `dependabot-automerge.yml` use `GITHUB_TOKEN`, and pushes made with `GITHUB_TOKEN` don't trigger push workflows, so those merges get no `push` run. Run the commands above before opening a PR. `dependabot-automerge.yml` turns on squash auto-merge only for Dependabot PRs whose highest update is minor or patch; major updates wait for a human review. Docker base image updates (`package-ecosystem` `docker`) never auto-merge and always wait for a human review: Dependabot's docker ecosystem can move the image tag, not just its digest (for example `python:3.12-slim-trixie` to `python:3.14-slim-trixie`, a Python runtime upgrade that Dependabot labels a minor update), so the job logs a notice and leaves the PR open.
|
|
215
215
|
|
|
216
216
|
`release.yml` runs on `v*` tag pushes only: it creates the GitHub Release, then builds the container image, pushes it to GHCR, attests it, and publishes to the MCP Registry. In the template repo the image is built only (no push), and the attest and registry jobs skip. Release procedure (tag-based versioning, release notes, pre-tag checks): **`COOKBOOK.md`** Recipes 1–2; product-repo migration steps: Recipe 9.
|
|
@@ -9,6 +9,7 @@ Thank you for your interest in contributing!
|
|
|
9
9
|
5. Open a Pull Request. Merges are performed via **Squash Merge** with Conventional Commit titles (`feat:`, `fix:`, `docs:`, `chore:`).
|
|
10
10
|
6. Changing statute or publication rows? Follow "Adding or changing a row" below and run `uv run python scripts/build_catalog.py --check`.
|
|
11
11
|
7. Do not edit version numbers or `CHANGELOG.md`: the git tag is the version, and GitHub Releases are the changelog. The squash commit message is the PR body, so a breaking (`feat!:` / `fix!:`) PR ends its body with one `BREAKING CHANGE:` final paragraph that lists the breaking items, with no migration steps.
|
|
12
|
+
8. Do not edit `docker/build-backend.txt` by hand.
|
|
12
13
|
|
|
13
14
|
## Adding or changing a row
|
|
14
15
|
|
|
@@ -17,10 +18,10 @@ Statute and publication rows live only in the data files under `src/taxcode_mcp/
|
|
|
17
18
|
| File | Holds |
|
|
18
19
|
| --- | --- |
|
|
19
20
|
| `jurisdictions.json` | Jurisdiction codes in catalog order. Rows load in this order, then in file order. |
|
|
20
|
-
| `statutes/<code>.json` | One jurisdiction's statute rows (`us.json`, `pr.json`, `ga.json`, ...). `text_en` and `
|
|
21
|
+
| `statutes/<code>.json` | One jurisdiction's statute rows (`us.json`, `pr.json`, `can.json`, `ga.json`, ...). `text_en`, `text_es` and optional `text_fr` (required on `CAN` rows, stored in `statutes_fr`) are lists of lines, joined with a newline when loaded. |
|
|
21
22
|
| `publications/<code>.json` | Publications whose `id` starts with `<code>-`. |
|
|
22
23
|
| `manifest/<code>.json` | One source record per statute and publication row and per rate table of that jurisdiction. |
|
|
23
|
-
| `rates/<code>.json` | The rate table the compliance tools compute a state's tax from. See "Changing a rate table" below. |
|
|
24
|
+
| `rates/<code>.json` | The rate table the compliance tools compute a state's or country's tax from (`RATE_TABLE_MODELS` and `COUNTRY_RATE_TABLES` in `src/taxcode_mcp/catalog.py`). See "Changing a rate table" below. |
|
|
24
25
|
|
|
25
26
|
Every manifest entry has every field below. A value we don't have is the explicit string `"not_recorded"`, never a missing key and never a guess.
|
|
26
27
|
|
|
@@ -36,7 +37,9 @@ Every manifest entry has every field below. A value we don't have is the explici
|
|
|
36
37
|
| `enacting_law` | Law that enacted or last amended the text, or `"not_recorded"`. |
|
|
37
38
|
| `effective_date` | Date the text took effect (`YYYY-MM-DD`), or `"not_recorded"`. |
|
|
38
39
|
| `verification` | `verified_verbatim` (checked word for word against the fetched source; needs `retrieved` and `content_sha256`), `summary` (the stored text is a summary, not a copy), or `"not_recorded"`. |
|
|
39
|
-
| `
|
|
40
|
+
| `french_source` | Optional, `statute` entries only, after `verification`, and required when the row has `text_fr`. An object with `url` (https) and `content_sha256` (64 lowercase hex digits) for the fetched French source artifact. |
|
|
41
|
+
| `verification_note` | Optional, and only on a `rate_table` whose `verification` is `not_recorded`, after `verification` and before `year_sources`. A non-empty string saying why that table could not be confirmed. A checked table does not carry it. |
|
|
42
|
+
| `year_sources` | Optional, `rate_table` and `federal_table` entries only, as the last field. A list of the sources for figures of other tax years or corroborating second sources on `url`'s year, `tax_year` ascending. Each has exactly `tax_year`, `values` (the table values it confirms, keyed by their path in `params`, such as `rates[0].rate`, `deduction_mfj_2025` or `years[0].brackets[4].rate`, or for the federal table in its document, such as `years[6].single`; each must equal the table's value), `url` (https), `official` (`true`), `retrieved` and `content_sha256` (`"not_recorded"` when the bytes could not be kept). |
|
|
40
43
|
|
|
41
44
|
To add or change a row:
|
|
42
45
|
|
|
@@ -49,19 +52,20 @@ A new jurisdiction also needs its code in `jurisdictions.json` and, for its name
|
|
|
49
52
|
|
|
50
53
|
## Changing a rate table
|
|
51
54
|
|
|
52
|
-
Every deduction, exemption, bracket, rate and per-year value the compliance tools use lives in `src/taxcode_mcp/data/rates/<code>.json`, one file per state that has one (`RATE_TABLE_MODELS` in `src/taxcode_mcp/catalog.py`). FL and TX have none. Never add a rate as a Python literal.
|
|
55
|
+
Every deduction, exemption, bracket, rate and per-year value the compliance tools use lives in `src/taxcode_mcp/data/rates/<code>.json`, one file per state that has one plus country tables in `COUNTRY_RATE_TABLES` (`RATE_TABLE_MODELS` in `src/taxcode_mcp/catalog.py`). FL and TX have none. Never add a rate as a Python literal.
|
|
53
56
|
|
|
54
57
|
- `model` names the shape of `params` and which formula reads it. It must match `RATE_TABLE_MODELS`.
|
|
55
58
|
- Amounts and rates are floats (`1000.0`, not `1000`), because tool output prints them as stored.
|
|
56
59
|
- `brackets` and `rates` are lists tried in order: the first step whose `over` the taxable income exceeds (or whose `from_year` the tax year has reached) applies, and the last step's `over` or `from_year` is `null`. Filing-status values are `{"single": ..., "mfj": ...}`.
|
|
57
60
|
- Each `rates` step also carries its prose: a `flat_by_year` step (CO, NC) its whole `rate_desc`, and a `georgia` step the `law` that set that year's rate, which both Georgia answers cite. Georgia's flat rate starts with tax year 2024, so an earlier tax year gets the oldest step and its answers say they are an estimate.
|
|
58
61
|
- Each table has a `source_url` and a `rate_table` entry in `manifest/<code>.json` with the same `url`. A table whose numbers have not been checked against official text keeps `"not_recorded"` in both. Record a source only once it has been checked, and only an official one: `url` is the document the brackets were read from, `retrieved` the day it was fetched and `content_sha256` the hash of the fetched bytes (`"not_recorded"` when the bytes could not be kept).
|
|
59
|
-
- `registry` tables keep their original keys. A `_YYYY` suffix holds the value from that tax year on, and the unsuffixed key covers the years before. Never copy a current value into an earlier year.
|
|
60
|
-
- The `flat_with_surtax` table's `surtax`, the `capital_gains_excise` table's `capital_gains_deduction` and the `brackets_cumulative` table's `brackets` follow the same convention: `surtax_2024`, `capital_gains_deduction_2024` or `
|
|
62
|
+
- `registry` tables keep their original keys. A `_YYYY` suffix holds the value from that tax year on, and the unsuffixed key covers the years before. Never copy a current value into an earlier year. A year with no sourced amount is a `not_recorded` entry on `params`, `{"param", "tax_year", "reason"}`, omitted when empty, and the rate table's manifest entry repeats that list after `year_sources`. `param` is the base series (`deduction`, `brackets`, `rates`, `credit_base`, ...); one entry covers both filing statuses. The lookup stops on that exact year. A later year with no marker still uses the last real `_YYYY` value. The catalog rejects a marker on a year the tools read for a different year (Georgia's 2024 and 2026 standard deduction, and Georgia's 2026 rate step) and a Georgia `standard_deduction` marker for a year before 2018, which reads the 2024 amount. A table with no `_YYYY` key and no `rates` step cannot mark a year. The federal standard deduction table has no such list.
|
|
63
|
+
- The `flat_with_surtax` table's `surtax`, the `capital_gains_excise` table's `capital_gains_deduction` and the `brackets_cumulative` table's `brackets` and `exemption` follow the same convention: `surtax_2024`, `capital_gains_deduction_2024`, `brackets_2025` or `exemption_2025`, after the model's own fields with years ascending for each name, holds the value from that year on, and the unsuffixed key keeps the earlier years. The `capital_gains_excise` table's `tier` (`{"over": ..., "rate": ...}`, an additional rate on the taxable gains over `over`) takes only `tier_YYYY` keys and doesn't apply before the first one. The `georgia` table's `standard_deduction` and `retirement_exclusion` take `_YYYY` keys the same way (`standard_deduction_2026`, `retirement_exclusion_2027`), after `rates`, years ascending. A tax year after `GA_LAST_FIXED_YEAR` (the last year whose deduction and rate HB 463 of 2026 fixes) uses that year's figures and is labeled an estimate, because HB 463's later increases and rate cuts depend on revenue tests.
|
|
61
64
|
- Registry deductions take `_2024`, `_2025` and `_2026`. Registry `brackets` and `rate_desc` take `brackets_YYYY` and `rate_desc_YYYY` for 2024 to 2030, and the four `credit_base_*` / `credit_phaseout_*` amounts take `_2025`. Each needs its unsuffixed key and comes after it, years ascending; `brackets_YYYY` is validated like `brackets` and doesn't count as one of the three graduated keys below. A tax year after `MS_LAST_ENACTED_RATE_YEAR`, `UT_LAST_CREDIT_AMOUNT_YEAR`, `NE_LAST_PUBLISHED_SCHEDULE_YEAR` or `OH_LAST_FIXED_SCHEDULE_YEAR` (tied by tests to the last year each table holds) carries that table's figures forward and is labeled an estimate in its rate prose.
|
|
62
|
-
- A graduated `registry` table says how it taxes income below its top bracket with exactly one of
|
|
65
|
+
- A graduated `registry` table says how it taxes income below its top bracket with exactly one of two keys. `brackets` is the state's official marginal schedule (`over` and `rate` only, the lowest step's `over` is `null`), and replaces the `top_*`, `zero_*` and `middle_*` keys. `middle_rate` is a single statutory rate for the middle band. Every `evaluate_state_residency` answer carries `middle_rate_is_estimate` (always `false`; the former 65%-of-top stand-in is gone). Never invent a middle-band rate where an official schedule exists.
|
|
63
66
|
- A `registry` table may take a nonrefundable credit off the computed tax, as Utah's taxpayer tax credit does, with all six `credit_*` keys: `credit_rate` times the filing status's `credit_base`, less `credit_phaseout_rate` times the taxable income over its `credit_phaseout` amount, never below zero. Model such a credit as a credit, not as a deduction.
|
|
64
67
|
|
|
68
|
+
- The `canada_federal` model (`rates/can.json`, `COUNTRY_RATE_TABLES`) holds Canada's federal Part I schedule and `ITA s. 128.1` departure-tax parameters: consecutive ascending `years` (each with `tax_year`, graduated `brackets`, `credit_rate`, and `basic_personal_amount` carrying `maximum`, `minimum`, `phaseout_start` and `phaseout_end` for the `ITA s. 118(1.1)` phaseout between the fourth and fifth brackets) plus `capital_gains_inclusion_rate`, `sojourner_days`, `t1161_threshold`, `personal_use_reporting_threshold`, `personal_use_minimum` and `short_term_resident_months`, backed by `can-rates` and `year_sources` in `manifest/can.json`.
|
|
65
69
|
- The federal standard deduction by tax year lives in `src/taxcode_mcp/data/federal/standard_deduction.json` (`years`, consecutive and ascending, each with `tax_year`, `single` and `mfj`), with a `federal_table` entry `us-standard-deduction` in `manifest/us.json` and a `year_sources` item for each year. A `flat_by_year` table whose `deduction` is the string `"federal_standard_deduction"` (CO) uses that table's figure for the tax year, or the nearest year it holds, with an estimate label. Other tables keep their own sourced amounts: a state's conformity to a federal figure is its own law.
|
|
66
70
|
|
|
67
71
|
The files load and are validated when the server starts. `tests/test_compliance_golden.py` pins the exact output of every compliance tool over a wide input grid, so a rate change also updates those files (`uv run python tests/golden_compliance.py --write`) and the diff shows which answers moved.
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
ARG CA_CERTIFICATES_FLOOR=20250419+deb13u1
|
|
19
19
|
|
|
20
20
|
# ─── Stage 1: Builder ─────────────────────────────────────────────────────────
|
|
21
|
-
FROM python:3.14-slim@sha256:fbecd461fc72d21b2143c6eaba25143738079154a6d0ea3da3aec724f50eed4a AS builder
|
|
21
|
+
FROM python:3.14-slim-trixie@sha256:fbecd461fc72d21b2143c6eaba25143738079154a6d0ea3da3aec724f50eed4a AS builder
|
|
22
22
|
|
|
23
23
|
ARG CA_CERTIFICATES_FLOOR
|
|
24
24
|
RUN apt-get update && \
|
|
@@ -34,7 +34,7 @@ WORKDIR /app
|
|
|
34
34
|
RUN python -m venv /opt/venv
|
|
35
35
|
ENV PATH="/opt/venv/bin:$PATH"
|
|
36
36
|
|
|
37
|
-
COPY docker/pip-bootstrap.txt docker/uv-bootstrap.txt /tmp/
|
|
37
|
+
COPY docker/pip-bootstrap.txt docker/uv-bootstrap.txt docker/build-backend.txt /tmp/
|
|
38
38
|
COPY pyproject.toml uv.lock README.md LICENSE ./
|
|
39
39
|
COPY src/ src/
|
|
40
40
|
|
|
@@ -55,19 +55,27 @@ ENV UV_DYNAMIC_VERSIONING_BYPASS=${UV_DYNAMIC_VERSIONING_BYPASS}
|
|
|
55
55
|
# in docker/uv-bootstrap.txt and installed to /tmp/uv outside the venv (the runtime image gets no
|
|
56
56
|
# uv), only exports the lock: the base dependencies, with no extras and not the project, as a
|
|
57
57
|
# requirements file with a hash for every package. --locked fails the build if uv.lock is out of
|
|
58
|
-
# date with pyproject.toml. pip installs that file in hash-checking mode
|
|
59
|
-
#
|
|
58
|
+
# date with pyproject.toml. pip installs that file in hash-checking mode. The project build backend
|
|
59
|
+
# (hatchling, uv-dynamic-versioning, and their transitive deps) is hash-pinned in
|
|
60
|
+
# docker/build-backend.txt and installed with --require-hashes --only-binary=:all: to
|
|
61
|
+
# /tmp/build-backend, outside the venv, and is on PYTHONPATH only for
|
|
62
|
+
# `pip install --no-deps --no-build-isolation .`. The runtime image copies only the venv, so it
|
|
63
|
+
# gets the project and its runtime dependencies but no build backend. Neither runtime nor build
|
|
64
|
+
# dependencies are resolved from PyPI by version range at build time.
|
|
60
65
|
# https://docs.astral.sh/uv/concepts/projects/export/ and
|
|
61
66
|
# https://pip.pypa.io/en/stable/topics/secure-installs/
|
|
67
|
+
# https://pip.pypa.io/en/stable/cli/pip_install/ (--no-build-isolation, --require-hashes)
|
|
62
68
|
RUN pip install --no-cache-dir --require-hashes --only-binary=:all: -r /tmp/pip-bootstrap.txt && \
|
|
63
69
|
pip install --no-cache-dir --require-hashes --only-binary=:all: --target /tmp/uv -r /tmp/uv-bootstrap.txt && \
|
|
64
70
|
/tmp/uv/bin/uv export --locked --no-dev --no-emit-project --format requirements.txt \
|
|
65
71
|
-o /tmp/requirements.txt && \
|
|
66
72
|
pip install --no-cache-dir --require-hashes --only-binary=:all: -r /tmp/requirements.txt && \
|
|
67
|
-
pip install --no-cache-dir --
|
|
73
|
+
pip install --no-cache-dir --require-hashes --only-binary=:all: --target /tmp/build-backend \
|
|
74
|
+
-r /tmp/build-backend.txt && \
|
|
75
|
+
PYTHONPATH=/tmp/build-backend pip install --no-cache-dir --no-deps --no-build-isolation .
|
|
68
76
|
|
|
69
77
|
# ─── Stage 2: Runtime ─────────────────────────────────────────────────────────
|
|
70
|
-
FROM python:3.14-slim@sha256:fbecd461fc72d21b2143c6eaba25143738079154a6d0ea3da3aec724f50eed4a AS runtime
|
|
78
|
+
FROM python:3.14-slim-trixie@sha256:fbecd461fc72d21b2143c6eaba25143738079154a6d0ea3da3aec724f50eed4a AS runtime
|
|
71
79
|
|
|
72
80
|
# MCP Registry ownership check for the OCI package: must equal server.json "name".
|
|
73
81
|
# https://modelcontextprotocol.io/registry/package-types#docker%2Foci-images
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: mcp-server-taxcode
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.4.0
|
|
4
4
|
Summary: Enterprise Model Context Protocol (MCP) server for Tax Code
|
|
5
5
|
Project-URL: Homepage, https://github.com/christianclaudio/mcp-server-taxcode
|
|
6
6
|
Project-URL: Documentation, https://github.com/christianclaudio/mcp-server-taxcode#readme
|
|
@@ -22,17 +22,17 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
22
22
|
Classifier: Programming Language :: Python :: 3.14
|
|
23
23
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
24
24
|
Requires-Python: >=3.11
|
|
25
|
-
Requires-Dist: certifi>=2026.10.
|
|
25
|
+
Requires-Dist: certifi>=2026.10.23
|
|
26
26
|
Requires-Dist: duckdb>=1.5.6
|
|
27
|
-
Requires-Dist: fastmcp>=4.1.
|
|
27
|
+
Requires-Dist: fastmcp>=4.1.8
|
|
28
28
|
Requires-Dist: httpx>=0.28.1
|
|
29
29
|
Requires-Dist: mcp>=2.3.0
|
|
30
30
|
Requires-Dist: pydantic-settings>=2.15.0
|
|
31
31
|
Requires-Dist: pydantic>=2.13.5
|
|
32
32
|
Provides-Extra: code-mode
|
|
33
|
-
Requires-Dist: fastmcp[code-mode]>=4.1.
|
|
33
|
+
Requires-Dist: fastmcp[code-mode]>=4.1.8; extra == 'code-mode'
|
|
34
34
|
Provides-Extra: dev
|
|
35
|
-
Requires-Dist: fastmcp[code-mode]>=4.1.
|
|
35
|
+
Requires-Dist: fastmcp[code-mode]>=4.1.8; extra == 'dev'
|
|
36
36
|
Requires-Dist: mypy>=2.4.0; extra == 'dev'
|
|
37
37
|
Requires-Dist: opentelemetry-sdk>=1.45.1; extra == 'dev'
|
|
38
38
|
Requires-Dist: pytest-asyncio>=1.4.0; extra == 'dev'
|
|
@@ -69,9 +69,9 @@ graph TD
|
|
|
69
69
|
Gateway["FastMCP Root Gateway<br>(stdio / streamable-http)"]
|
|
70
70
|
ParentMW["Parent Middleware<br>(Audit Logging, Timing, Secret Redaction, ReadOnly Gate)"]
|
|
71
71
|
SysSub["System Sub-server (mount: 'system')<br>• system_get_health_status<br>• taxcode://system/reference/capabilities"]
|
|
72
|
-
StatSub["Statutes Sub-server (mount: 'statutes')<br>• statutes_lookup_statute<br>• statutes_search_tax_code<br>• statutes_list_publications<br>• taxcode://statutes/{jurisdiction}/{section}"]
|
|
72
|
+
StatSub["Statutes Sub-server (mount: 'statutes')<br>• statutes_lookup_statute<br>• statutes_search_tax_code<br>• statutes_list_publications<br>• taxcode://statutes/{jurisdiction}/{section*}"]
|
|
73
73
|
CompSub["Compliance Sub-server (mount: 'compliance')<br>• compliance_evaluate_pr_bona_fide_residency<br>• compliance_calculate_built_in_gain_sourcing<br>• compliance_evaluate_georgia_residency<br>• compliance_evaluate_state_residency"]
|
|
74
|
-
DuckDB["DuckDB In-Memory & File Engine<br>(
|
|
74
|
+
DuckDB["DuckDB In-Memory & File Engine<br>(235 Statutes, 42 Publications, Full-Text Search, Temporal Versions)"]
|
|
75
75
|
|
|
76
76
|
Client <-->|"JSON-RPC (tools/list, tools/call)"| Gateway
|
|
77
77
|
Gateway --> ParentMW
|
|
@@ -90,14 +90,15 @@ graph TD
|
|
|
90
90
|
* **Federal (`US`)**: IRC § 1, § 24, § 32, § 61, § 62, § 63, § 865, § 911, § 933, § 937, § 957, § 1411, § 6012, § 6688, 26 CFR § 1.937-1/2/3, and IRS publications (Pub. 17, Pub. 54, Pub. 501, Pub. 505, Pub. 570, Pub. 1321).
|
|
91
91
|
* **Puerto Rico (`PR`)**: Act 60-2019 (Resident Individual Investors, Export Services & Opportunity Zone definitions, Sec. 6020.10 annual reports), Ley 1-2011 (including Sec. 1031.02 exemptions and Sec. 1062.01 wage withholding and Sec. 1062.03 withholding on payments for services), Act 22-2012 predecessor versions, and administrative publications (CC RI 21-10, CC RI 25-12, CC RI 26-13, DA 21-04, DA 23-04, BI RI 26-02).
|
|
92
92
|
* **All 50 US States + District of Columbia**: Comprehensive statutory definitions and tax computations covering no-income-tax states (AK, FL, NV, NH, SD, TN, TX, WA, WY), flat-tax regimes (AZ, CO, GA, ID, IL, IN, IA, KS, KY, MI, MS, NC, PA, UT), and graduated/surtax jurisdictions (AL, AR, CA, CT, DE, DC, HI, LA, ME, MD, MA, MN, MO, MT, NE, NJ, NM, NY, ND, OH, OK, OR, RI, SC, VT, VA, WV, WI) including Convenience of the Employer rules (NY, PA, NJ, CT, DE, NE) and local piggyback taxes (MD, IN, OH, NY).
|
|
93
|
+
* **Canada federal (`CAN`)**: Income Tax Act ss. 2, 38, 114, 115, 117, 117.1, 118, 128.1, 153, 212 and 250 and Income Tax Regulations ss. 100, 102, 103, 105, 202, 805, 2600 and 2601, in the official English and French text of the Justice Canada consolidation (pinned laws-lois-xml commits; prior-year versions of ss. 117 and 118 from 2019), with unofficial Spanish summaries, plus CRA guidance (Folio S5-F1-C1, Forms T1161, T1243 and T1244, Leaving Canada). `statutes_lookup_statute` and `statutes_search_tax_code` take `lang="fr"`. `CA` stays California.
|
|
93
94
|
* **Snippet Search, Full Text by Id**: `statutes_search_tax_code` matches and ranks on the full text but returns a short snippet (up to 300 characters around the first matched term) plus each result's `id`, citation, title, jurisdiction, year, validity and content labels. Pass an `id` to `statutes_lookup_statute` as `citation_or_section` for the full text.
|
|
94
|
-
* **Bounded Responses with Paging**: Every statutes tool result stays under 32,000 characters of JSON. `statutes_lookup_statute` returns long text in pages of up to 8,000 characters per text field (`text_page` gives the offset and full lengths; pass `next_cursor` back as `page_cursor` for the next page). `statutes_search_tax_code` and `statutes_list_publications` clamp `limit` to 1..25 items per call, with `offset` and `next_offset` for the next page. The `taxcode://statutes/{jurisdiction}/{section}` resource (for example `taxcode://statutes/US/933`) uses the same 8,000-character pages and cap: a page that is not the last ends with the URI of the next one, which carries a `?page_cursor=` query.
|
|
95
|
+
* **Bounded Responses with Paging**: Every statutes tool result stays under 32,000 characters of JSON. `statutes_lookup_statute` returns long text in pages of up to 8,000 characters per text field (`text_page` gives the offset and full lengths; pass `next_cursor` back as `page_cursor` for the next page). `statutes_search_tax_code` and `statutes_list_publications` clamp `limit` to 1..25 items per call, with `offset` and `next_offset` for the next page. The `taxcode://statutes/{jurisdiction}/{section*}` resource (for example `taxcode://statutes/US/933`, or `taxcode://statutes/IL/5/201` for a section id that contains `/`) uses the same 8,000-character pages and cap: a page that is not the last ends with the URI of the next one, which carries a `?page_cursor=` query. The `{section*}` wildcard matches multi-segment section ids; a percent-encoded form such as `5%2F201` also works.
|
|
95
96
|
* **Versioned Data Files**: Every statute and publication row lives in per-jurisdiction JSON under `src/taxcode_mcp/data/` with a source record per row, and the docs under `docs/` are generated from them (see [`CONTRIBUTING.md`](CONTRIBUTING.md)).
|
|
96
97
|
* **Temporal Statutory Versioning**: Point-in-time statutory lookup with `superseded_year` filtering and descending historical ordering (`tax_year` parameter).
|
|
97
98
|
* **Deterministic Compliance Engines**:
|
|
98
99
|
* `evaluate_pr_bona_fide_residency`: Evaluates IRC § 937 presence (183-day, 549-day 3-year, 90-day US), tax home, and closer connection tests.
|
|
99
100
|
* `calculate_built_in_gain_sourcing`: Allocates Section 937 / Act 60 capital gains across pre-move and post-move holding periods.
|
|
100
|
-
* `evaluate_state_residency`: Multi-state statutory presence day-counter, permanent place of abode (PPA), domicile audit risk flags, and tax liability computation across all 50 US states and District of Columbia (51 jurisdictions total).
|
|
101
|
+
* `evaluate_state_residency`: Multi-state statutory presence day-counter, permanent place of abode (PPA), domicile audit risk flags, and tax liability computation across all 50 US states and District of Columbia (51 jurisdictions total). Optional `dependents`, Mississippi `spouse_agi` (MFJ combined returns; even split of the filing-status exemption and standard deduction; ignored for other states), and Utah `itemized_deductions` (federal itemized deductions excluding state income tax) refine KS/MS/OH/GA/UT liability; defaults keep prior results. `jurisdiction="CAN"` (or `"Canada"`) evaluates Canada federal residency (factual, 183-day sojourner, part-year emigrant, non-resident) and estimates federal Part I tax for 2019-2026; `event="emigration"` with `emigration_properties` adds the ITA s. 128.1 departure tax estimate and the T1161 reporting test.
|
|
101
102
|
* **Profiles & Opt-in ToolSearch**:
|
|
102
103
|
* Domain-mount profiles: `full`, `system`, `statutes`, `compliance`, `readonly`.
|
|
103
104
|
* Job-shaped allowlist profiles: `researcher` (statutes + circulars), `advisor` (cross-border residency + BIG calculations).
|
|
@@ -25,9 +25,9 @@ graph TD
|
|
|
25
25
|
Gateway["FastMCP Root Gateway<br>(stdio / streamable-http)"]
|
|
26
26
|
ParentMW["Parent Middleware<br>(Audit Logging, Timing, Secret Redaction, ReadOnly Gate)"]
|
|
27
27
|
SysSub["System Sub-server (mount: 'system')<br>• system_get_health_status<br>• taxcode://system/reference/capabilities"]
|
|
28
|
-
StatSub["Statutes Sub-server (mount: 'statutes')<br>• statutes_lookup_statute<br>• statutes_search_tax_code<br>• statutes_list_publications<br>• taxcode://statutes/{jurisdiction}/{section}"]
|
|
28
|
+
StatSub["Statutes Sub-server (mount: 'statutes')<br>• statutes_lookup_statute<br>• statutes_search_tax_code<br>• statutes_list_publications<br>• taxcode://statutes/{jurisdiction}/{section*}"]
|
|
29
29
|
CompSub["Compliance Sub-server (mount: 'compliance')<br>• compliance_evaluate_pr_bona_fide_residency<br>• compliance_calculate_built_in_gain_sourcing<br>• compliance_evaluate_georgia_residency<br>• compliance_evaluate_state_residency"]
|
|
30
|
-
DuckDB["DuckDB In-Memory & File Engine<br>(
|
|
30
|
+
DuckDB["DuckDB In-Memory & File Engine<br>(235 Statutes, 42 Publications, Full-Text Search, Temporal Versions)"]
|
|
31
31
|
|
|
32
32
|
Client <-->|"JSON-RPC (tools/list, tools/call)"| Gateway
|
|
33
33
|
Gateway --> ParentMW
|
|
@@ -46,14 +46,15 @@ graph TD
|
|
|
46
46
|
* **Federal (`US`)**: IRC § 1, § 24, § 32, § 61, § 62, § 63, § 865, § 911, § 933, § 937, § 957, § 1411, § 6012, § 6688, 26 CFR § 1.937-1/2/3, and IRS publications (Pub. 17, Pub. 54, Pub. 501, Pub. 505, Pub. 570, Pub. 1321).
|
|
47
47
|
* **Puerto Rico (`PR`)**: Act 60-2019 (Resident Individual Investors, Export Services & Opportunity Zone definitions, Sec. 6020.10 annual reports), Ley 1-2011 (including Sec. 1031.02 exemptions and Sec. 1062.01 wage withholding and Sec. 1062.03 withholding on payments for services), Act 22-2012 predecessor versions, and administrative publications (CC RI 21-10, CC RI 25-12, CC RI 26-13, DA 21-04, DA 23-04, BI RI 26-02).
|
|
48
48
|
* **All 50 US States + District of Columbia**: Comprehensive statutory definitions and tax computations covering no-income-tax states (AK, FL, NV, NH, SD, TN, TX, WA, WY), flat-tax regimes (AZ, CO, GA, ID, IL, IN, IA, KS, KY, MI, MS, NC, PA, UT), and graduated/surtax jurisdictions (AL, AR, CA, CT, DE, DC, HI, LA, ME, MD, MA, MN, MO, MT, NE, NJ, NM, NY, ND, OH, OK, OR, RI, SC, VT, VA, WV, WI) including Convenience of the Employer rules (NY, PA, NJ, CT, DE, NE) and local piggyback taxes (MD, IN, OH, NY).
|
|
49
|
+
* **Canada federal (`CAN`)**: Income Tax Act ss. 2, 38, 114, 115, 117, 117.1, 118, 128.1, 153, 212 and 250 and Income Tax Regulations ss. 100, 102, 103, 105, 202, 805, 2600 and 2601, in the official English and French text of the Justice Canada consolidation (pinned laws-lois-xml commits; prior-year versions of ss. 117 and 118 from 2019), with unofficial Spanish summaries, plus CRA guidance (Folio S5-F1-C1, Forms T1161, T1243 and T1244, Leaving Canada). `statutes_lookup_statute` and `statutes_search_tax_code` take `lang="fr"`. `CA` stays California.
|
|
49
50
|
* **Snippet Search, Full Text by Id**: `statutes_search_tax_code` matches and ranks on the full text but returns a short snippet (up to 300 characters around the first matched term) plus each result's `id`, citation, title, jurisdiction, year, validity and content labels. Pass an `id` to `statutes_lookup_statute` as `citation_or_section` for the full text.
|
|
50
|
-
* **Bounded Responses with Paging**: Every statutes tool result stays under 32,000 characters of JSON. `statutes_lookup_statute` returns long text in pages of up to 8,000 characters per text field (`text_page` gives the offset and full lengths; pass `next_cursor` back as `page_cursor` for the next page). `statutes_search_tax_code` and `statutes_list_publications` clamp `limit` to 1..25 items per call, with `offset` and `next_offset` for the next page. The `taxcode://statutes/{jurisdiction}/{section}` resource (for example `taxcode://statutes/US/933`) uses the same 8,000-character pages and cap: a page that is not the last ends with the URI of the next one, which carries a `?page_cursor=` query.
|
|
51
|
+
* **Bounded Responses with Paging**: Every statutes tool result stays under 32,000 characters of JSON. `statutes_lookup_statute` returns long text in pages of up to 8,000 characters per text field (`text_page` gives the offset and full lengths; pass `next_cursor` back as `page_cursor` for the next page). `statutes_search_tax_code` and `statutes_list_publications` clamp `limit` to 1..25 items per call, with `offset` and `next_offset` for the next page. The `taxcode://statutes/{jurisdiction}/{section*}` resource (for example `taxcode://statutes/US/933`, or `taxcode://statutes/IL/5/201` for a section id that contains `/`) uses the same 8,000-character pages and cap: a page that is not the last ends with the URI of the next one, which carries a `?page_cursor=` query. The `{section*}` wildcard matches multi-segment section ids; a percent-encoded form such as `5%2F201` also works.
|
|
51
52
|
* **Versioned Data Files**: Every statute and publication row lives in per-jurisdiction JSON under `src/taxcode_mcp/data/` with a source record per row, and the docs under `docs/` are generated from them (see [`CONTRIBUTING.md`](CONTRIBUTING.md)).
|
|
52
53
|
* **Temporal Statutory Versioning**: Point-in-time statutory lookup with `superseded_year` filtering and descending historical ordering (`tax_year` parameter).
|
|
53
54
|
* **Deterministic Compliance Engines**:
|
|
54
55
|
* `evaluate_pr_bona_fide_residency`: Evaluates IRC § 937 presence (183-day, 549-day 3-year, 90-day US), tax home, and closer connection tests.
|
|
55
56
|
* `calculate_built_in_gain_sourcing`: Allocates Section 937 / Act 60 capital gains across pre-move and post-move holding periods.
|
|
56
|
-
* `evaluate_state_residency`: Multi-state statutory presence day-counter, permanent place of abode (PPA), domicile audit risk flags, and tax liability computation across all 50 US states and District of Columbia (51 jurisdictions total).
|
|
57
|
+
* `evaluate_state_residency`: Multi-state statutory presence day-counter, permanent place of abode (PPA), domicile audit risk flags, and tax liability computation across all 50 US states and District of Columbia (51 jurisdictions total). Optional `dependents`, Mississippi `spouse_agi` (MFJ combined returns; even split of the filing-status exemption and standard deduction; ignored for other states), and Utah `itemized_deductions` (federal itemized deductions excluding state income tax) refine KS/MS/OH/GA/UT liability; defaults keep prior results. `jurisdiction="CAN"` (or `"Canada"`) evaluates Canada federal residency (factual, 183-day sojourner, part-year emigrant, non-resident) and estimates federal Part I tax for 2019-2026; `event="emigration"` with `emigration_properties` adds the ITA s. 128.1 departure tax estimate and the T1161 reporting test.
|
|
57
58
|
* **Profiles & Opt-in ToolSearch**:
|
|
58
59
|
* Domain-mount profiles: `full`, `system`, `statutes`, `compliance`, `readonly`.
|
|
59
60
|
* Job-shaped allowlist profiles: `researcher` (statutes + circulars), `advisor` (cross-border residency + BIG calculations).
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Build backend for the Dockerfile project install: the build-backend dependency group in
|
|
2
|
+
# pyproject.toml and its closure from uv.lock. Generated by scripts/gen_build_backend.py;
|
|
3
|
+
# do not edit by hand. Installed with --require-hashes --only-binary=:all: to
|
|
4
|
+
# /tmp/build-backend, outside the venv, and on PYTHONPATH only for the project install.
|
|
5
|
+
# Wheels only: py3-none-any, or the base image's CPython manylinux x86_64 and aarch64.
|
|
6
|
+
dunamai==1.26.3 \
|
|
7
|
+
--hash=sha256:cc486963f21ad5b5b20d95424909ff5029990241eea3e2272865e1542c5fd19f
|
|
8
|
+
hatchling==1.33.0 \
|
|
9
|
+
--hash=sha256:415290b84f464d2884303fca8974d38e7b85579069fab02a15db0828fbb1446d
|
|
10
|
+
jinja2==3.1.6 \
|
|
11
|
+
--hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67
|
|
12
|
+
markupsafe==3.0.4 \
|
|
13
|
+
--hash=sha256:1caa2fa5a6184fb233153b35f654e6687bd555476f6170f29d8ee9be1a8b0af9 \
|
|
14
|
+
--hash=sha256:a8e9f292fcda89b324f2f5c91d13f1424a153e40fc2756f38ee23b15835ff300
|
|
15
|
+
packaging==26.3 \
|
|
16
|
+
--hash=sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c
|
|
17
|
+
pathspec==1.1.1 \
|
|
18
|
+
--hash=sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189
|
|
19
|
+
pluggy==1.6.0 \
|
|
20
|
+
--hash=sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746
|
|
21
|
+
tomlkit==0.15.2 \
|
|
22
|
+
--hash=sha256:05562412163a3037b94497385fb7f9204c637bc605af7a48199e41cf2272f437
|
|
23
|
+
trove-classifiers==2026.9.21.13 \
|
|
24
|
+
--hash=sha256:8b1ff4f9c191b1040b71c37f1e445ab99732911e3cd91de52838453a854d7a17
|
|
25
|
+
uv-dynamic-versioning==0.14.1 \
|
|
26
|
+
--hash=sha256:f9db710cc2ce9dccf06fab958ad10c45cae43cff70e3eccaa89365b040e98306
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# pip for the Dockerfile builder's bootstrap, installed with --require-hashes so the install
|
|
2
|
-
# does not depend on TLS trust. Hash of pip-26.
|
|
2
|
+
# does not depend on TLS trust. Hash of pip-26.3-py3-none-any.whl from PyPI's JSON API
|
|
3
3
|
# (digests.sha256). Bump this pin and hash together with the pip floor; Dependabot does not.
|
|
4
|
-
pip==26.
|
|
5
|
-
--hash=sha256:
|
|
4
|
+
pip==26.3 \
|
|
5
|
+
--hash=sha256:f3b60b20ffaadd4415ed7957212a38ac63fa4c5fa375bd0f4a797777940fad13
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# uv for the Dockerfile builder, which only runs `uv export` to turn uv.lock into a requirements
|
|
2
|
+
# file with hashes. Installed with --require-hashes, so the install does not depend on TLS trust.
|
|
3
|
+
# Hashes are digests.sha256 from PyPI's JSON API (https://pypi.org/pypi/uv/<version>/json) for
|
|
4
|
+
# every file published for the pinned version: each wheel and the sdist. Dependabot's uv updates
|
|
5
|
+
# bump the pin and rewrite the hashes. Keep the version within pyproject.toml's [tool.uv]
|
|
6
|
+
# required-version, and bump the pin and hashes together when editing the file by hand.
|
|
7
|
+
uv==0.13.7 \
|
|
8
|
+
--hash=sha256:08f16fd463926786b702b497473511deae4b3e17a2fa6d22180950d6059a120d \
|
|
9
|
+
--hash=sha256:158953b8669bee6f4bc2babdd997e34ff9f0d57170093cfe907f64448292b7c3 \
|
|
10
|
+
--hash=sha256:1bc8543d930464bbb22ac01bb1a660a448235e558014914de1e1cd5b993361b8 \
|
|
11
|
+
--hash=sha256:2835e2ab397d0db86323b9975dce75ecd76aa9cfa0d6a2aea84734aae7f8c9b3 \
|
|
12
|
+
--hash=sha256:2c9bdc4a872b60a93c5f26c0791089ea11585a4f9d3b3c017d78eb8487505e25 \
|
|
13
|
+
--hash=sha256:55e741a380a98008fc4985cf069855f36bc50242ef438e21a466786f5bc84da8 \
|
|
14
|
+
--hash=sha256:57ff66891d9a738ec087c23fdde842ac8e5eb63189ffed6ee95caee1b82ceb54 \
|
|
15
|
+
--hash=sha256:5e766791cb825d7a07e2ef9e622d307b48754fb682a31ba7bc5f272fab9ea395 \
|
|
16
|
+
--hash=sha256:5f37cc4d4660e4aee8a24d0dc179a0b0ce99506259c6796d37fa69bca9543a03 \
|
|
17
|
+
--hash=sha256:89df450624dec8c48b8b5a7adb654928cc50e95753f869c70cd65ef8333f2197 \
|
|
18
|
+
--hash=sha256:8b8ac028ae4ebb2a3f9d04907c61794f2cf8d7a7002bfbb4019a3dee28351fb2 \
|
|
19
|
+
--hash=sha256:8fc6019740794df995085f7b278d99dc11ccacffad9c63957278d3a6e272280b \
|
|
20
|
+
--hash=sha256:917733990ebc178318af0321d6873823ed5da707e1c4b1e5060ac2065a81f1f3 \
|
|
21
|
+
--hash=sha256:94f65a8ac5826dff76a93cb3cafbaad15def1788c63da2ce5ce09e0bd1303e7a \
|
|
22
|
+
--hash=sha256:952dcae9b1a7742f2fab28e82391fbfabe8807e4e9363f674b0f6be1053b8dd4 \
|
|
23
|
+
--hash=sha256:a90f5d95716ab83091f0f73a8e7ec64e557abf2a28537fcd719b2ac88e6f725a \
|
|
24
|
+
--hash=sha256:d30cafb7070901ba35353ec64cf228ae46caf79ac0f6fae329f95468b1482531 \
|
|
25
|
+
--hash=sha256:f91a229093163eefca89ea1b220a221d64c3beade05d03519a6584d1797a5a5f \
|
|
26
|
+
--hash=sha256:fd04bf01ba5f2829f4f94ca8f0c24a743f21e73d75045613ed6fc2fd66fc7bda
|
|
@@ -8,10 +8,10 @@
|
|
|
8
8
|
- **Hierarchy:** `18 CCR > Division 3 > Chapter 2.5 > Subchapter 1 > § 17014`
|
|
9
9
|
- **Cross References:** `Cal. Rev. & Tax Code § 17014`
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## Unofficial Reference Summary (English)
|
|
12
12
|
|
|
13
13
|
FTB regulation detailing domicile and residence determination. A person may have multiple residences but only one domicile. Applies the closest connection test evaluating real property, family, bank accounts, business affiliations, and licenses.
|
|
14
14
|
|
|
15
|
-
##
|
|
15
|
+
## Resumen de referencia no oficial (Español)
|
|
16
16
|
|
|
17
17
|
Reglamento de la FTB sobre residencia y domicilio. Aplica el criterio de conexión más cercana evaluando propiedades inmuebles, familia, cuentas bancarias, licencias profesionales y afiliaciones comerciales.
|