mcp-server-taxcode 1.1.0__tar.gz → 1.3.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.3.0/.github/CODEOWNERS +1 -0
- mcp_server_taxcode-1.3.0/.github/dependabot.yml +58 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/.github/workflows/ci.yml +108 -18
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/.github/workflows/release.yml +6 -6
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/AGENTS.md +4 -3
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/CONTRIBUTING.md +13 -7
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/Dockerfile +25 -4
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/PKG-INFO +10 -10
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/README.md +5 -4
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/conformance-baseline.yml +10 -6
- mcp_server_taxcode-1.3.0/docker/build-backend.txt +26 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docker/pip-bootstrap.txt +3 -3
- mcp_server_taxcode-1.3.0/docker/uv-bootstrap.txt +26 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ca/caccr_17014.md +2 -2
- mcp_server_taxcode-1.3.0/docs/ca/llms-full.txt +174 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ca/rtc_17014.md +2 -2
- mcp_server_taxcode-1.3.0/docs/ca/rtc_17015.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ca/rtc_17016.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ca/rtc_17041.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ca/rtc_17041_i.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ca/rtc_17043.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ca/rtc_17043_2024.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ca/rtc_17052_10.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ca/rtc_17054.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ca/rtc_17062.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ca/rtc_17071.md +17 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ca/rtc_17951.md +2 -2
- mcp_server_taxcode-1.3.0/docs/ca/rtc_17952.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ca/rtc_17952_5.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ca/rtc_18001.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ca/rtc_18002.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ca/rtc_18662.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ca/rtc_19900.md +17 -0
- mcp_server_taxcode-1.3.0/docs/can/ita_114.md +40 -0
- mcp_server_taxcode-1.3.0/docs/can/ita_115.md +194 -0
- mcp_server_taxcode-1.3.0/docs/can/ita_117.md +72 -0
- mcp_server_taxcode-1.3.0/docs/can/ita_117_1.md +101 -0
- mcp_server_taxcode-1.3.0/docs/can/ita_117_2019.md +60 -0
- mcp_server_taxcode-1.3.0/docs/can/ita_117_2023.md +72 -0
- mcp_server_taxcode-1.3.0/docs/can/ita_118.md +403 -0
- mcp_server_taxcode-1.3.0/docs/can/ita_118_2019.md +305 -0
- mcp_server_taxcode-1.3.0/docs/can/ita_118_2020.md +371 -0
- mcp_server_taxcode-1.3.0/docs/can/ita_118_2023.md +371 -0
- mcp_server_taxcode-1.3.0/docs/can/ita_128_1.md +503 -0
- mcp_server_taxcode-1.3.0/docs/can/ita_153.md +308 -0
- mcp_server_taxcode-1.3.0/docs/can/ita_2.md +39 -0
- mcp_server_taxcode-1.3.0/docs/can/ita_212.md +989 -0
- mcp_server_taxcode-1.3.0/docs/can/ita_250.md +194 -0
- mcp_server_taxcode-1.3.0/docs/can/ita_38.md +71 -0
- mcp_server_taxcode-1.3.0/docs/can/itr_100.md +200 -0
- mcp_server_taxcode-1.3.0/docs/can/itr_102.md +146 -0
- mcp_server_taxcode-1.3.0/docs/can/itr_103.md +172 -0
- mcp_server_taxcode-1.3.0/docs/can/itr_105.md +30 -0
- mcp_server_taxcode-1.3.0/docs/can/itr_202.md +94 -0
- mcp_server_taxcode-1.3.0/docs/can/itr_2600.md +36 -0
- mcp_server_taxcode-1.3.0/docs/can/itr_2601.md +45 -0
- mcp_server_taxcode-1.3.0/docs/can/itr_805.md +26 -0
- mcp_server_taxcode-1.3.0/docs/can/llms-full.txt +4603 -0
- mcp_server_taxcode-1.3.0/docs/ga/llms-full.txt +64 -0
- mcp_server_taxcode-1.3.0/docs/ga/ocga_48_7_20.md +17 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ga/ocga_48_7_20_2024.md +3 -3
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ga/ocga_48_7_20_2025.md +3 -3
- mcp_server_taxcode-1.3.0/docs/ga/ocga_48_7_27.md +17 -0
- mcp_server_taxcode-1.3.0/docs/id/idaho code_63_3024.md +17 -0
- mcp_server_taxcode-1.3.0/docs/id/llms-full.txt +10 -0
- mcp_server_taxcode-1.3.0/docs/il/ilcs_5_1501_a_14.md +17 -0
- mcp_server_taxcode-1.3.0/docs/il/ilcs_5_1501_a_16.md +17 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/il/ilcs_5_1501_a_20.md +2 -2
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/il/ilcs_5_201.md +2 -2
- mcp_server_taxcode-1.3.0/docs/il/ilcs_5_201_p.md +17 -0
- mcp_server_taxcode-1.3.0/docs/il/ilcs_5_202.md +17 -0
- mcp_server_taxcode-1.3.0/docs/il/ilcs_5_203_a.md +17 -0
- mcp_server_taxcode-1.3.0/docs/il/ilcs_5_204.md +17 -0
- mcp_server_taxcode-1.3.0/docs/il/ilcs_5_208.md +17 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/il/ilcs_5_301.md +2 -2
- mcp_server_taxcode-1.3.0/docs/il/ilcs_5_302.md +17 -0
- mcp_server_taxcode-1.3.0/docs/il/ilcs_5_303.md +17 -0
- mcp_server_taxcode-1.3.0/docs/il/ilcs_5_304_a.md +17 -0
- mcp_server_taxcode-1.3.0/docs/il/ilcs_5_305.md +17 -0
- mcp_server_taxcode-1.3.0/docs/il/ilcs_5_601_b_3.md +17 -0
- mcp_server_taxcode-1.3.0/docs/il/ilcs_5_701.md +17 -0
- mcp_server_taxcode-1.3.0/docs/il/llms-full.txt +147 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/llms-full.txt +8 -7
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/llms.txt +124 -6
- mcp_server_taxcode-1.3.0/docs/ma/llms-full.txt +138 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ma/maconst_art__xliv.md +2 -2
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ma/mgl_62_1_f.md +2 -2
- mcp_server_taxcode-1.3.0/docs/ma/mgl_62_2.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ma/mgl_62_3_b_a_9.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ma/mgl_62_3_b_a_9_2022.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ma/mgl_62_3_b_b.md +17 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ma/mgl_62_4.md +2 -2
- mcp_server_taxcode-1.3.0/docs/ma/mgl_62_4_a.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ma/mgl_62_5a.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ma/mgl_62_6_a.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ma/mgl_62_6_h.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ma/mgl_62_6_k.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ma/mgl_62_6_x.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ma/mgl_62b_2.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ma/mgl_63d_2.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ms/llms-full.txt +10 -0
- mcp_server_taxcode-1.3.0/docs/ms/miss. code_27_7_5.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ne/llms-full.txt +10 -0
- mcp_server_taxcode-1.3.0/docs/ne/neb. rev. stat._77_2715_03.md +17 -0
- mcp_server_taxcode-1.3.0/docs/nj/llms-full.txt +147 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nj/njac_18_35_5_2.md +2 -2
- mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_12_3.md +17 -0
- mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_12_5.md +17 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nj/njsa_54a_1_2.md +2 -2
- mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_1_2_m/342/200/223_n.md +17 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nj/njsa_54a_2_1.md +2 -2
- mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_3_1.md +17 -0
- mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_3a_17.md +17 -0
- mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_4_1.md +17 -0
- mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_4_1_1.md +17 -0
- mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_5_1.md +17 -0
- mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_5_2.md +17 -0
- mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_5_8.md +17 -0
- mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_5_8_2022.md +17 -0
- mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_7_1.md +17 -0
- mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_9_17_e.md +17 -0
- mcp_server_taxcode-1.3.0/docs/nm/nmsa_7_2_7.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ny/llms-full.txt +165 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ny/nycrr_105_20.md +2 -2
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ny/nycrr_132_18.md +2 -2
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ny/nytax_601.md +2 -2
- mcp_server_taxcode-1.3.0/docs/ny/nytax_601_d.md +17 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ny/nytax_605.md +2 -2
- mcp_server_taxcode-1.3.0/docs/ny/nytax_605_b_1_a.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ny/nytax_611.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ny/nytax_612.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ny/nytax_614.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ny/nytax_615.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ny/nytax_616.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ny/nytax_620.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ny/nytax_631.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ny/nytax_632.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ny/nytax_638.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ny/nytax_639.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ny/nytax_671.md +17 -0
- mcp_server_taxcode-1.3.0/docs/ny/nytax_861.md +17 -0
- mcp_server_taxcode-1.3.0/docs/oh/llms-full.txt +19 -0
- mcp_server_taxcode-1.3.0/docs/oh/r.c._5747_02.md +17 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ok/68 o.s._2355.md +1 -1
- mcp_server_taxcode-1.3.0/docs/pr/cri_1031_02_2019.md +25 -0
- mcp_server_taxcode-1.3.0/docs/pr/cri_1062_01_2019.md +25 -0
- mcp_server_taxcode-1.3.0/docs/pr/cri_1062_03_2019.md +27 -0
- mcp_server_taxcode-1.3.0/docs/pr/ley60_1020_02_2019.md +48 -0
- mcp_server_taxcode-1.3.0/docs/pr/ley60_1020_02_2020.md +25 -0
- mcp_server_taxcode-1.3.0/docs/pr/ley60_2022_02_2019.md +20 -0
- mcp_server_taxcode-1.3.0/docs/pr/ley60_6020_03_2019.md +22 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_6020_10.md +4 -3
- mcp_server_taxcode-1.3.0/docs/pr/ley60_6020_10_2019.md +40 -0
- mcp_server_taxcode-1.3.0/docs/pr/ley60_6020_10_2020.md +32 -0
- mcp_server_taxcode-1.3.0/docs/pr/ley60_6020_10_2022.md +32 -0
- mcp_server_taxcode-1.1.0/docs/pr/ley60_6020_10_2019.md → mcp_server_taxcode-1.3.0/docs/pr/ley60_6020_10_2024.md +10 -8
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_6020_10_2025.md +5 -4
- mcp_server_taxcode-1.3.0/docs/pr/ley60_6060_05.md +30 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/llms-full.txt +254 -12
- mcp_server_taxcode-1.3.0/docs/us/cfr_1_937_3_2019.md +39 -0
- mcp_server_taxcode-1.3.0/docs/us/irc_1_2019.md +22 -0
- mcp_server_taxcode-1.3.0/docs/us/irc_1_2020.md +403 -0
- mcp_server_taxcode-1.3.0/docs/us/irc_24_2019.md +101 -0
- mcp_server_taxcode-1.3.0/docs/us/irc_24_2021.md +186 -0
- mcp_server_taxcode-1.3.0/docs/us/irc_32_2019.md +151 -0
- mcp_server_taxcode-1.3.0/docs/us/irc_62_2019.md +136 -0
- mcp_server_taxcode-1.3.0/docs/us/irc_62_2020.md +23 -0
- mcp_server_taxcode-1.3.0/docs/us/irc_62_2021.md +135 -0
- mcp_server_taxcode-1.3.0/docs/us/irc_63_2019.md +100 -0
- mcp_server_taxcode-1.3.0/docs/us/irc_63_2021.md +100 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/llms-full.txt +1431 -123
- mcp_server_taxcode-1.3.0/docs/ut/llms-full.txt +10 -0
- mcp_server_taxcode-1.3.0/docs/ut/utah code_59_10_104.md +17 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/wa/llms-full.txt +2 -2
- mcp_server_taxcode-1.3.0/docs/wa/rcw_82_87_040.md +17 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/fastmcp.json +1 -1
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/pyproject.toml +16 -7
- mcp_server_taxcode-1.3.0/scripts/build_corrected_pins.py +73 -0
- mcp_server_taxcode-1.3.0/scripts/build_prior_years_pins.py +255 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/scripts/check_tool_contract.py +35 -8
- mcp_server_taxcode-1.3.0/scripts/extract_canada_lims.py +113 -0
- mcp_server_taxcode-1.3.0/scripts/gen_build_backend.py +195 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/scripts/ingest_statutes.py +9 -1
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/scripts/setup_repo_governance.sh +2 -3
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/skills/taxcode-mcp/SKILL.md +2 -2
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/catalog.py +693 -45
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/federal/standard_deduction.json +48 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/jurisdictions.json +2 -1
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/ak.json +5 -5
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/al.json +98 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ar.json +62 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/az.json +2 -1
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ca.json +321 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/can.json +783 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/co.json +31 -1
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/ct.json +5 -5
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/dc.json +1 -1
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/de.json +1 -1
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ga.json +302 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/hi.json +58 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/ia.json +14 -1
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/id.json +70 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/il.json +249 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/in.json +1 -1
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ks.json +243 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/ky.json +35 -4
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/la.json +16 -1
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ma.json +256 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/md.json +35 -5
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/me.json +4 -3
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/mi.json +4 -3
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/mn.json +2 -1
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/mo.json +2 -1
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ms.json +175 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/mt.json +2 -1
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/nc.json +87 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/nd.json +1 -1
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ne.json +139 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/nh.json +57 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/nj.json +227 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/nm.json +88 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/nv.json +33 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ny.json +253 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/oh.json +131 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/ok.json +20 -4
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/or.json +1 -1
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/pa.json +1 -1
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/pr.json +149 -6
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ri.json +96 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/sc.json +48 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/sd.json +33 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/tn.json +6 -6
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/us.json +246 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ut.json +166 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/va.json +139 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/vt.json +4 -3
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/wa.json +33 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/wi.json +69 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/wv.json +15 -1
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/wy.json +6 -5
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/publications/can.json +51 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/publications/ga.json +15 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/ak.json +1 -1
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/al.json +54 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/ar.json +107 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/az.json +1 -4
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/ca.json +188 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/can.json +272 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/co.json +21 -4
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/ct.json +742 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/dc.json +2 -2
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/ga.json +177 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/hi.json +105 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/ia.json +2 -2
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/id.json +25 -2
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/ks.json +100 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/ky.json +8 -1
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/ma.json +8 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/md.json +232 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/me.json +2 -2
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/mo.json +2 -2
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/ms.json +177 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/mt.json +2 -2
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/nc.json +17 -2
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/nd.json +2 -2
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/ne.json +214 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/nh.json +17 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/nj.json +33 -5
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/nm.json +157 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/nv.json +1 -1
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/ny.json +41 -9
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/oh.json +172 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/ok.json +40 -1
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/ri.json +108 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/sc.json +25 -2
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/sd.json +1 -1
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/tn.json +1 -1
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/ut.json +33 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/va.json +30 -2
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/wa.json +6 -1
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/wi.json +40 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/wv.json +48 -1
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/wy.json +1 -1
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/statutes/ca.json +435 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/statutes/can.json +4953 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ga.json +11 -11
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/id.json +2 -2
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/statutes/il.json +372 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/statutes/ma.json +343 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ms.json +2 -2
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/statutes/ne.json +26 -0
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/statutes/nj.json +369 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/nm.json +1 -1
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/statutes/ny.json +419 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/oh.json +2 -2
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ok.json +1 -1
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/pr.json +411 -17
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/us.json +1845 -382
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ut.json +2 -2
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/wa.json +2 -2
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/db.py +226 -22
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/disclaimers.py +166 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/paging.py +11 -7
- mcp_server_taxcode-1.3.0/src/taxcode_mcp/tools/canada.py +452 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/tools/compliance.py +749 -126
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/tools/statutes.py +38 -8
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/tools/system.py +1 -1
- mcp_server_taxcode-1.3.0/tests/fixtures/compliance_golden/compliance_evaluate_georgia_residency.jsonl.gz +0 -0
- mcp_server_taxcode-1.3.0/tests/fixtures/compliance_golden/compliance_evaluate_state_residency.jsonl.gz +0 -0
- mcp_server_taxcode-1.3.0/tests/fixtures/prior_years/corrected_answers.json +367 -0
- mcp_server_taxcode-1.3.0/tests/fixtures/prior_years/f4f0d5d_pins.json.gz +0 -0
- mcp_server_taxcode-1.3.0/tests/fixtures/wave1/existing_rows.json +19 -0
- mcp_server_taxcode-1.3.0/tests/fixtures/wave1/searches.json +953 -0
- mcp_server_taxcode-1.3.0/tests/fixtures/wave1/sources.json +337 -0
- mcp_server_taxcode-1.3.0/tests/test_al_md_ca_data_fixes.py +105 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_batch.py +39 -0
- mcp_server_taxcode-1.3.0/tests/test_build_backend_lock.py +145 -0
- mcp_server_taxcode-1.3.0/tests/test_canada_federal.py +908 -0
- mcp_server_taxcode-1.3.0/tests/test_catalog.py +1092 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_code_mode_extra.py +1 -5
- mcp_server_taxcode-1.3.0/tests/test_ct_md_edges.py +107 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_db.py +66 -19
- mcp_server_taxcode-1.3.0/tests/test_dependents_spouse_inputs.py +133 -0
- mcp_server_taxcode-1.3.0/tests/test_dockerfile.py +280 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_e2e_live.py +2 -1
- mcp_server_taxcode-1.3.0/tests/test_fastmcp_json_floor.py +75 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_ingest.py +114 -14
- mcp_server_taxcode-1.3.0/tests/test_notfound_pointer.py +205 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_paging.py +19 -8
- mcp_server_taxcode-1.3.0/tests/test_prior_years.py +619 -0
- mcp_server_taxcode-1.3.0/tests/test_prior_years_pin.py +684 -0
- mcp_server_taxcode-1.3.0/tests/test_prior_years_pr.py +616 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_protocol.py +13 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_rate_prose.py +5 -11
- mcp_server_taxcode-1.3.0/tests/test_rate_tables.py +1451 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_search_normalize.py +8 -1
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_search_snippets.py +30 -19
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_server.py +121 -64
- mcp_server_taxcode-1.3.0/tests/test_statute_section_slash.py +62 -0
- mcp_server_taxcode-1.3.0/tests/test_undated_current_rows.py +68 -0
- mcp_server_taxcode-1.3.0/tests/test_wave1_state_statutes.py +201 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/uv.lock +481 -747
- mcp_server_taxcode-1.1.0/.github/dependabot.yml +0 -36
- mcp_server_taxcode-1.1.0/.github/workflows/drift-monitor.yml +0 -47
- mcp_server_taxcode-1.1.0/docs/ca/llms-full.txt +0 -37
- mcp_server_taxcode-1.1.0/docs/ca/rtc_17041.md +0 -17
- mcp_server_taxcode-1.1.0/docs/ga/llms-full.txt +0 -64
- mcp_server_taxcode-1.1.0/docs/ga/ocga_48_7_20.md +0 -17
- mcp_server_taxcode-1.1.0/docs/ga/ocga_48_7_27.md +0 -17
- mcp_server_taxcode-1.1.0/docs/id/idaho code_63_3024.md +0 -17
- mcp_server_taxcode-1.1.0/docs/id/llms-full.txt +0 -10
- mcp_server_taxcode-1.1.0/docs/il/llms-full.txt +0 -28
- mcp_server_taxcode-1.1.0/docs/ma/llms-full.txt +0 -28
- mcp_server_taxcode-1.1.0/docs/ms/llms-full.txt +0 -10
- mcp_server_taxcode-1.1.0/docs/ms/miss. code_27_7_5.md +0 -17
- mcp_server_taxcode-1.1.0/docs/ne/llms-full.txt +0 -10
- mcp_server_taxcode-1.1.0/docs/ne/neb. rev. stat._77_2715_03.md +0 -17
- mcp_server_taxcode-1.1.0/docs/nj/llms-full.txt +0 -28
- mcp_server_taxcode-1.1.0/docs/nm/nmsa_7_2_7.md +0 -17
- mcp_server_taxcode-1.1.0/docs/ny/llms-full.txt +0 -37
- mcp_server_taxcode-1.1.0/docs/oh/llms-full.txt +0 -19
- mcp_server_taxcode-1.1.0/docs/oh/r.c._5747_02.md +0 -17
- mcp_server_taxcode-1.1.0/docs/ut/llms-full.txt +0 -10
- mcp_server_taxcode-1.1.0/docs/ut/utah code_59_10_104.md +0 -17
- mcp_server_taxcode-1.1.0/docs/wa/rcw_82_87_040.md +0 -17
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/al.json +0 -32
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ar.json +0 -32
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ca.json +0 -71
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ga.json +0 -136
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/hi.json +0 -32
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/id.json +0 -32
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/il.json +0 -58
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ks.json +0 -32
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ma.json +0 -70
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ms.json +0 -32
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/nc.json +0 -45
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ne.json +0 -45
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/nh.json +0 -32
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/nj.json +0 -58
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/nm.json +0 -32
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/nv.json +0 -32
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ny.json +0 -71
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/oh.json +0 -58
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ri.json +0 -45
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/sc.json +0 -32
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/sd.json +0 -32
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ut.json +0 -32
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/va.json +0 -71
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/wi.json +0 -32
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/publications/ga.json +0 -24
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/al.json +0 -44
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/ar.json +0 -18
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/ca.json +0 -50
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/ct.json +0 -50
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/ga.json +0 -39
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/ks.json +0 -36
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/md.json +0 -49
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/ms.json +0 -36
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/ne.json +0 -54
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/nh.json +0 -12
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/nm.json +0 -63
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/oh.json +0 -48
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/ri.json +0 -46
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/ut.json +0 -19
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/statutes/ca.json +0 -96
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/statutes/il.json +0 -73
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/statutes/ma.json +0 -73
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/statutes/ne.json +0 -26
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/statutes/nj.json +0 -73
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/statutes/ny.json +0 -95
- mcp_server_taxcode-1.1.0/src/taxcode_mcp/disclaimers.py +0 -90
- mcp_server_taxcode-1.1.0/tests/fixtures/compliance_golden/compliance_evaluate_georgia_residency.jsonl.gz +0 -0
- mcp_server_taxcode-1.1.0/tests/fixtures/compliance_golden/compliance_evaluate_state_residency.jsonl.gz +0 -0
- mcp_server_taxcode-1.1.0/tests/test_catalog.py +0 -555
- mcp_server_taxcode-1.1.0/tests/test_dockerfile.py +0 -141
- mcp_server_taxcode-1.1.0/tests/test_rate_tables.py +0 -586
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/.github/workflows/dependabot-automerge.yml +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/.gitignore +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/CHANGELOG.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/CODE_OF_CONDUCT.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/LICENSE +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/SECURITY.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ak/alaska stat._43_05_080.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ak/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/al/ala. code_40_18_2.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/al/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ar/a.c.a._26_51_201.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ar/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/az/a.r.s._43_1011.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/az/a.r.s._43_104.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/az/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/co/c.r.s._39_22_103.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/co/c.r.s._39_22_104.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/co/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ct/c.g.s._12_700.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ct/c.g.s._12_701.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ct/c.g.s._12_711.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ct/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/dc/d.c. code_47_1806_03.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/dc/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/de/del. code_1102.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/de/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/fl/flconst_art__vii_sec__5.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/fl/flstat_196_031.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/fl/flstat_222_17.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/fl/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ga/gareg_560_7_3__01.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ga/ocga_48_7_1.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ga/ocga_48_7_30.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/hi/hrs_235_51.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/hi/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ia/iowa code_422_5.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ia/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/in/ind. code_6_3_2_1.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/in/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ks/k.s.a._79_32,110.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ks/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ky/krs_141_020.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ky/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/la/la. r.s._47_32.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/la/la. r.s._47_32_2022.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/la/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/md/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/md/md. code_10_101.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/md/md. code_10_105.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/md/md. code_10_106.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/me/36 m.r.s._5111.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/me/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/mi/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/mi/mcl_206_51.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/mn/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/mn/minn. stat._290_06.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/mo/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/mo/rsmo_143_011.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/mt/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/mt/mca_15_30_2103.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nc/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nc/n.c.g.s._105_153_3.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nc/n.c.g.s._105_153_7.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nd/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nd/n.d.c.c._57_38_30_3.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nh/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nh/rsa_77_1_2024.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nm/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nv/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nv/nev. const._art__10,_/302/247_1.md" +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/oh/r.c._5747_24.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ok/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/or/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/or/ors_316_037.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pa/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pa/p.s._7301.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pa/p.s._7302.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pa/pa. code_109_8.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/cri_1010_01.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/cri_1031_01.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/cri_1031_02.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/cri_1062_01.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/cri_1062_03.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley22_3_2012.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_1020_02.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_2021_01.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_2022_01.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_2022_01_2019.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_2022_02.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_2031_01.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_2032_01.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_6020_03.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_6070_55.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ri/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ri/r.i.g.l._44_30_1.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/sc/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/sc/s.c. code_12_6_510.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/sd/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/sd/s.d. const._art__xi,_/302/247_2.md" +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/tn/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/tn/tenn. const._art__ii,_/302/247_28.md" +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/tx/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/tx/txconst_art__viii_sec__24_a.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/tx/txtax_171_001.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/cfr_1_937_1.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/cfr_1_937_2.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/cfr_1_937_3.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_1.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_1411.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_24.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_32.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_6012.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_61.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_62.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_63.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_6688.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_865.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_911.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_933.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_937.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_957.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/va/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/va/va. code_58_1_302.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/va/va. code_58_1_320.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/va/va. code_58_1_342.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/vt/32 v.s.a._5822.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/vt/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/wa/rcw_82_87_020.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/wa/waconst_art__vii_sec__1.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/wi/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/wi/wis. stat._71_06.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/wv/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/wv/w. va. code_11_21_4e.md +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/wy/llms-full.txt +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/wy/wyo. const._art__15,_/302/247_18.md" +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/scripts/build_catalog.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/scripts/check_conformance.sh +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/scripts/check_openapi_drift.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/scripts/check_version.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/scripts/release_notes.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/server.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/__init__.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/auth.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/client.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/config.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/fl.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/tx.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/publications/md.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/publications/oh.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/publications/pa.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/publications/pr.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/publications/us.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/publications/va.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/de.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/il.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/in.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/la.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/mi.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/mn.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/or.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/pa.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/vt.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ak.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/al.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ar.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/az.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/co.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ct.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/dc.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/de.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/fl.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/hi.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ia.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/in.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ks.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ky.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/la.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/md.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/me.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/mi.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/mn.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/mo.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/mt.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/nc.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/nd.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/nh.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/nv.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/or.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/pa.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ri.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/sc.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/sd.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/tn.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/tx.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/va.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/vt.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/wi.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/wv.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/wy.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/errors.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/middleware.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/profiles.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/server.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/ssrf.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/tools/__init__.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/conftest.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/fake_network.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/fixtures/compliance_golden/compliance_calculate_built_in_gain_sourcing.jsonl.gz +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/fixtures/compliance_golden/compliance_cross_border_tax_analysis.jsonl.gz +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/fixtures/compliance_golden/compliance_evaluate_pr_bona_fide_residency.jsonl.gz +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/fixtures/compliance_golden/constants.json +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/fixtures/usc26_sample.xml +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/golden_compliance.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_check_version.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_client.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_compliance_golden.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_config.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_conftest_auth_env.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_disclaimers.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_drift.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_errors.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_federal.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_http_auth.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_layered.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_network_guard.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_otel_spans.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_profiles.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_release_notes.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_ssrf.py +0 -0
- {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_version.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
* @christianclaudio
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: "uv"
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: "weekly"
|
|
7
|
+
day: "sunday"
|
|
8
|
+
time: "09:30"
|
|
9
|
+
timezone: "America/New_York"
|
|
10
|
+
open-pull-requests-limit: 10
|
|
11
|
+
groups:
|
|
12
|
+
dependencies:
|
|
13
|
+
patterns:
|
|
14
|
+
- "*"
|
|
15
|
+
python-security:
|
|
16
|
+
applies-to: "security-updates"
|
|
17
|
+
patterns:
|
|
18
|
+
- "*"
|
|
19
|
+
update-types:
|
|
20
|
+
- "minor"
|
|
21
|
+
- "patch"
|
|
22
|
+
|
|
23
|
+
- package-ecosystem: "github-actions"
|
|
24
|
+
directory: "/"
|
|
25
|
+
schedule:
|
|
26
|
+
interval: "weekly"
|
|
27
|
+
day: "sunday"
|
|
28
|
+
time: "09:30"
|
|
29
|
+
timezone: "America/New_York"
|
|
30
|
+
open-pull-requests-limit: 10
|
|
31
|
+
groups:
|
|
32
|
+
actions:
|
|
33
|
+
patterns:
|
|
34
|
+
- "*"
|
|
35
|
+
actions-security:
|
|
36
|
+
applies-to: "security-updates"
|
|
37
|
+
patterns:
|
|
38
|
+
- "*"
|
|
39
|
+
update-types:
|
|
40
|
+
- "minor"
|
|
41
|
+
- "patch"
|
|
42
|
+
|
|
43
|
+
- package-ecosystem: "docker"
|
|
44
|
+
directory: "/"
|
|
45
|
+
schedule:
|
|
46
|
+
interval: "weekly"
|
|
47
|
+
day: "sunday"
|
|
48
|
+
time: "09:30"
|
|
49
|
+
timezone: "America/New_York"
|
|
50
|
+
open-pull-requests-limit: 10
|
|
51
|
+
groups:
|
|
52
|
+
docker-security:
|
|
53
|
+
applies-to: "security-updates"
|
|
54
|
+
patterns:
|
|
55
|
+
- "*"
|
|
56
|
+
update-types:
|
|
57
|
+
- "minor"
|
|
58
|
+
- "patch"
|
|
@@ -7,10 +7,15 @@ on:
|
|
|
7
7
|
branches: [main]
|
|
8
8
|
# Merges made by dependabot-automerge.yml use GITHUB_TOKEN, and pushes made
|
|
9
9
|
# with GITHUB_TOKEN don't trigger push workflows, so the push trigger above
|
|
10
|
-
# misses them. The
|
|
11
|
-
#
|
|
10
|
+
# misses them. The weekly run tests main itself on Sunday afternoon Eastern,
|
|
11
|
+
# after the Sunday morning Dependabot run (.github/dependabot.yml), and is the
|
|
12
|
+
# only scheduled run of the drift-check job (manual dispatch also runs it);
|
|
13
|
+
# schedule runs only on the default branch.
|
|
14
|
+
# timezone keeps it at 15:53 Eastern through daylight saving changes. The minute
|
|
15
|
+
# is off the hour to avoid peak scheduler load.
|
|
12
16
|
schedule:
|
|
13
|
-
- cron: '
|
|
17
|
+
- cron: '53 15 * * 0'
|
|
18
|
+
timezone: "America/New_York"
|
|
14
19
|
workflow_dispatch:
|
|
15
20
|
|
|
16
21
|
concurrency:
|
|
@@ -35,7 +40,7 @@ jobs:
|
|
|
35
40
|
persist-credentials: false
|
|
36
41
|
|
|
37
42
|
- name: Install uv
|
|
38
|
-
uses: astral-sh/setup-uv@
|
|
43
|
+
uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
39
44
|
with:
|
|
40
45
|
# Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
|
|
41
46
|
# FastMCP's October 2026 certificate authority incident notice).
|
|
@@ -43,12 +48,12 @@ jobs:
|
|
|
43
48
|
enable-cache: true
|
|
44
49
|
|
|
45
50
|
- name: Set up Python
|
|
46
|
-
uses: actions/setup-python@
|
|
51
|
+
uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
|
|
47
52
|
with:
|
|
48
|
-
python-version: "3.
|
|
53
|
+
python-version: "3.11"
|
|
49
54
|
|
|
50
55
|
- name: Install dependencies
|
|
51
|
-
run: uv sync --locked --extra dev --python 3.
|
|
56
|
+
run: uv sync --locked --extra dev --python 3.11
|
|
52
57
|
|
|
53
58
|
- name: Check code formatting
|
|
54
59
|
run: uv run ruff format --check .
|
|
@@ -65,7 +70,7 @@ jobs:
|
|
|
65
70
|
strategy:
|
|
66
71
|
fail-fast: false
|
|
67
72
|
matrix:
|
|
68
|
-
python-version: ["3.
|
|
73
|
+
python-version: ["3.11", "3.12", "3.13", "3.14"]
|
|
69
74
|
steps:
|
|
70
75
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
71
76
|
with:
|
|
@@ -73,7 +78,7 @@ jobs:
|
|
|
73
78
|
persist-credentials: false
|
|
74
79
|
|
|
75
80
|
- name: Install uv
|
|
76
|
-
uses: astral-sh/setup-uv@
|
|
81
|
+
uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
77
82
|
with:
|
|
78
83
|
# Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
|
|
79
84
|
# FastMCP's October 2026 certificate authority incident notice).
|
|
@@ -81,7 +86,7 @@ jobs:
|
|
|
81
86
|
enable-cache: true
|
|
82
87
|
|
|
83
88
|
- name: Set up Python ${{ matrix.python-version }}
|
|
84
|
-
uses: actions/setup-python@
|
|
89
|
+
uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
|
|
85
90
|
with:
|
|
86
91
|
python-version: ${{ matrix.python-version }}
|
|
87
92
|
|
|
@@ -105,7 +110,7 @@ jobs:
|
|
|
105
110
|
persist-credentials: false
|
|
106
111
|
|
|
107
112
|
- name: Install uv
|
|
108
|
-
uses: astral-sh/setup-uv@
|
|
113
|
+
uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
109
114
|
with:
|
|
110
115
|
# Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
|
|
111
116
|
# FastMCP's October 2026 certificate authority incident notice).
|
|
@@ -113,12 +118,12 @@ jobs:
|
|
|
113
118
|
enable-cache: true
|
|
114
119
|
|
|
115
120
|
- name: Set up Python
|
|
116
|
-
uses: actions/setup-python@
|
|
121
|
+
uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
|
|
117
122
|
with:
|
|
118
|
-
python-version: "3.
|
|
123
|
+
python-version: "3.11"
|
|
119
124
|
|
|
120
125
|
- name: Install dependencies
|
|
121
|
-
run: uv sync --locked --extra dev --python 3.
|
|
126
|
+
run: uv sync --locked --extra dev --python 3.11
|
|
122
127
|
|
|
123
128
|
- name: Verify tool contracts
|
|
124
129
|
run: uv run python scripts/check_tool_contract.py
|
|
@@ -149,19 +154,19 @@ jobs:
|
|
|
149
154
|
persist-credentials: false
|
|
150
155
|
|
|
151
156
|
- name: Install uv
|
|
152
|
-
uses: astral-sh/setup-uv@
|
|
157
|
+
uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
153
158
|
with:
|
|
154
159
|
# Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
|
|
155
160
|
# FastMCP's October 2026 certificate authority incident notice).
|
|
156
161
|
version-file: "pyproject.toml"
|
|
157
162
|
|
|
158
163
|
- name: Set up Python
|
|
159
|
-
uses: actions/setup-python@
|
|
164
|
+
uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
|
|
160
165
|
with:
|
|
161
|
-
python-version: "3.
|
|
166
|
+
python-version: "3.11"
|
|
162
167
|
|
|
163
168
|
- name: Install dependencies
|
|
164
|
-
run: uv sync --locked --extra dev --python 3.
|
|
169
|
+
run: uv sync --locked --extra dev --python 3.11
|
|
165
170
|
|
|
166
171
|
- name: Build wheel and sdist
|
|
167
172
|
run: uv build
|
|
@@ -198,6 +203,59 @@ jobs:
|
|
|
198
203
|
fi
|
|
199
204
|
echo "Image label matches ${EXPECTED}"
|
|
200
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
|
+
|
|
201
259
|
- name: Builder fails below the ca-certificates floor
|
|
202
260
|
# Raising CA_CERTIFICATES_FLOOR above any real Debian version makes the installed
|
|
203
261
|
# package older than the floor, whatever version the base image or trixie-security
|
|
@@ -223,3 +281,35 @@ jobs:
|
|
|
223
281
|
exit 1
|
|
224
282
|
fi
|
|
225
283
|
echo "Builder stops at the ca-certificates floor check before any pip step"
|
|
284
|
+
|
|
285
|
+
drift-check:
|
|
286
|
+
name: Check API Drift
|
|
287
|
+
# Scheduled and manual runs only; pushes and pull requests skip it.
|
|
288
|
+
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
|
|
289
|
+
permissions:
|
|
290
|
+
contents: read
|
|
291
|
+
runs-on: ubuntu-latest
|
|
292
|
+
steps:
|
|
293
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
294
|
+
with:
|
|
295
|
+
fetch-depth: 0
|
|
296
|
+
persist-credentials: false
|
|
297
|
+
|
|
298
|
+
- name: Install uv
|
|
299
|
+
uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
300
|
+
with:
|
|
301
|
+
# Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
|
|
302
|
+
# FastMCP's October 2026 certificate authority incident notice).
|
|
303
|
+
version-file: "pyproject.toml"
|
|
304
|
+
enable-cache: true
|
|
305
|
+
|
|
306
|
+
- name: Set up Python
|
|
307
|
+
uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
|
|
308
|
+
with:
|
|
309
|
+
python-version: "3.11"
|
|
310
|
+
|
|
311
|
+
- name: Install dependencies
|
|
312
|
+
run: uv sync --locked --extra dev --python 3.11
|
|
313
|
+
|
|
314
|
+
- name: Run OpenAPI drift detection
|
|
315
|
+
run: uv run python scripts/check_openapi_drift.py
|
|
@@ -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).
|
|
@@ -34,9 +34,9 @@ jobs:
|
|
|
34
34
|
enable-cache: false
|
|
35
35
|
|
|
36
36
|
- name: Set up Python
|
|
37
|
-
uses: actions/setup-python@
|
|
37
|
+
uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
|
|
38
38
|
with:
|
|
39
|
-
python-version: "3.
|
|
39
|
+
python-version: "3.11"
|
|
40
40
|
|
|
41
41
|
- name: Build Wheel & Source Dist
|
|
42
42
|
run: uv build
|
|
@@ -94,10 +94,10 @@ jobs:
|
|
|
94
94
|
name: dist
|
|
95
95
|
|
|
96
96
|
- name: Publish to PyPI via OIDC
|
|
97
|
-
uses: pypa/gh-action-pypi-publish@
|
|
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,11 +46,11 @@ 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`).
|
|
53
|
-
- `.github/workflows/` — `ci.yml`, `
|
|
53
|
+
- `.github/workflows/` — `ci.yml`, `dependabot-automerge.yml`, and `release.yml` (on a `v*` tag: build with full history, verify the wheel version matches the tag, publish to PyPI via OIDC, create the GitHub Release from `scripts/release_notes.py`, build and push the container image to GHCR, attest build provenance for both wheel and container digests, and publish `server.json` to the MCP Registry). `ci.yml`'s `docker-build` job builds the image on every PR and checks its `io.modelcontextprotocol.server.name` label matches `server.json`.
|
|
54
54
|
- `scripts/release_notes.py` — release body from squash commits since the previous `v*` tag. `scripts/check_version.py` — runs after `uv build` and reads the version from the single wheel in `dist/` (the file that ships, as release.yml's tag check does); fails on `0.0.0` (no git metadata) or `0.0.1.devN` (no reachable tag, a shallow checkout).
|
|
55
55
|
- `server.json` (MCP Registry metadata), `Dockerfile`, `pyproject.toml`, `fastmcp.json`.
|
|
56
56
|
- `COOKBOOK.md` — private maintainer runbook (release SOP, drift, testing, composition, payload hardening, naming recipes). Template-only.
|
|
@@ -142,6 +142,7 @@ When translating an API documentation page, `llm.txt`, or OpenAPI specification
|
|
|
142
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.
|
|
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 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. Dependabot does not track that file (no `pip` ecosystem entry covers `docker/` in `.github/dependabot.yml`). `tests/test_dockerfile.py` enforces the install steps and the pins.
|
|
145
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.
|
|
146
147
|
4. **Registry Metadata Constraint**:
|
|
147
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).
|
|
@@ -210,6 +211,6 @@ coderabbit review --agent --uncommitted
|
|
|
210
211
|
|
|
211
212
|
## 🔄 CI & Releases
|
|
212
213
|
|
|
213
|
-
CI is defined in `.github/workflows/ci.yml` (jobs: `lint-and-types`, `test` on Python 3.
|
|
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` 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
215
|
|
|
215
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.
|
|
@@ -17,17 +17,17 @@ Statute and publication rows live only in the data files under `src/taxcode_mcp/
|
|
|
17
17
|
| File | Holds |
|
|
18
18
|
| --- | --- |
|
|
19
19
|
| `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 `
|
|
20
|
+
| `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
21
|
| `publications/<code>.json` | Publications whose `id` starts with `<code>-`. |
|
|
22
22
|
| `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. |
|
|
23
|
+
| `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
24
|
|
|
25
25
|
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
26
|
|
|
27
27
|
| Field | Meaning |
|
|
28
28
|
| --- | --- |
|
|
29
29
|
| `kind`, `id` | `statute` or `publication` and the row's `id`, or `rate_table` and `<code>-rates`. |
|
|
30
|
-
| `url` | Must equal the row's (or rate table's) `source_url`. |
|
|
30
|
+
| `url` | Must equal the row's (or rate or federal table's) `source_url`. |
|
|
31
31
|
| `edition` | Which text the source at `url` is: `as_enacted` (the law as passed), `amended_compilation` (a compilation with later amendments folded in, such as an OGP "según enmendada" text), or `"not_recorded"`. |
|
|
32
32
|
| `official` | `true` when the URL is on the issuing government body's own site, `false` for a third-party site, or `"not_recorded"`. It says nothing about whether the stored text is official. |
|
|
33
33
|
| `licence` | Reuse terms of the source, or `"not_recorded"`. |
|
|
@@ -36,7 +36,9 @@ Every manifest entry has every field below. A value we don't have is the explici
|
|
|
36
36
|
| `enacting_law` | Law that enacted or last amended the text, or `"not_recorded"`. |
|
|
37
37
|
| `effective_date` | Date the text took effect (`YYYY-MM-DD`), or `"not_recorded"`. |
|
|
38
38
|
| `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
|
-
| `
|
|
39
|
+
| `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. |
|
|
40
|
+
| `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. |
|
|
41
|
+
| `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
42
|
|
|
41
43
|
To add or change a row:
|
|
42
44
|
|
|
@@ -49,7 +51,7 @@ A new jurisdiction also needs its code in `jurisdictions.json` and, for its name
|
|
|
49
51
|
|
|
50
52
|
## Changing a rate table
|
|
51
53
|
|
|
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.
|
|
54
|
+
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
55
|
|
|
54
56
|
- `model` names the shape of `params` and which formula reads it. It must match `RATE_TABLE_MODELS`.
|
|
55
57
|
- Amounts and rates are floats (`1000.0`, not `1000`), because tool output prints them as stored.
|
|
@@ -57,8 +59,12 @@ Every deduction, exemption, bracket, rate and per-year value the compliance tool
|
|
|
57
59
|
- 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
60
|
- 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
61
|
- `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` and the `
|
|
61
|
-
-
|
|
62
|
+
- 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.
|
|
63
|
+
- 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.
|
|
64
|
+
- 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.
|
|
62
65
|
- 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.
|
|
63
66
|
|
|
67
|
+
- 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`.
|
|
68
|
+
- 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.
|
|
69
|
+
|
|
64
70
|
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.
|
|
@@ -34,8 +34,8 @@ 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 /
|
|
38
|
-
COPY pyproject.toml README.md LICENSE ./
|
|
37
|
+
COPY docker/pip-bootstrap.txt docker/uv-bootstrap.txt docker/build-backend.txt /tmp/
|
|
38
|
+
COPY pyproject.toml uv.lock README.md LICENSE ./
|
|
39
39
|
COPY src/ src/
|
|
40
40
|
|
|
41
41
|
# The build context has no .git, so uv-dynamic-versioning cannot read the tag and
|
|
@@ -45,13 +45,34 @@ ARG UV_DYNAMIC_VERSIONING_BYPASS
|
|
|
45
45
|
ENV UV_DYNAMIC_VERSIONING_BYPASS=${UV_DYNAMIC_VERSIONING_BYPASS}
|
|
46
46
|
|
|
47
47
|
# pip 26.2.2 updates the certificates pip bundles, per FastMCP's October 2026 certificate
|
|
48
|
-
# authority incident notice. This image
|
|
48
|
+
# authority incident notice. This image installs with pip, not uv, so pip carries the floor.
|
|
49
49
|
# https://github.com/PrefectHQ/fastmcp/blob/main/SECURITY.md#certificate-authority-incident-october-2026
|
|
50
50
|
# The bootstrap installs pip from a hash-pinned wheel (docker/pip-bootstrap.txt, --require-hashes),
|
|
51
51
|
# so it does not depend on the TLS trust of the base image's older pip and certifi; the maintainer
|
|
52
52
|
# who raises the pip floor updates that pin and its sha256 (Dependabot does not track the file).
|
|
53
|
+
#
|
|
54
|
+
# Runtime dependencies come from uv.lock, so the image runs the versions CI tests. uv, hash-pinned
|
|
55
|
+
# in docker/uv-bootstrap.txt and installed to /tmp/uv outside the venv (the runtime image gets no
|
|
56
|
+
# uv), only exports the lock: the base dependencies, with no extras and not the project, as a
|
|
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. 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.
|
|
65
|
+
# https://docs.astral.sh/uv/concepts/projects/export/ and
|
|
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)
|
|
53
68
|
RUN pip install --no-cache-dir --require-hashes --only-binary=:all: -r /tmp/pip-bootstrap.txt && \
|
|
54
|
-
pip install --no-cache-dir .
|
|
69
|
+
pip install --no-cache-dir --require-hashes --only-binary=:all: --target /tmp/uv -r /tmp/uv-bootstrap.txt && \
|
|
70
|
+
/tmp/uv/bin/uv export --locked --no-dev --no-emit-project --format requirements.txt \
|
|
71
|
+
-o /tmp/requirements.txt && \
|
|
72
|
+
pip install --no-cache-dir --require-hashes --only-binary=:all: -r /tmp/requirements.txt && \
|
|
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 .
|
|
55
76
|
|
|
56
77
|
# ─── Stage 2: Runtime ─────────────────────────────────────────────────────────
|
|
57
78
|
FROM python:3.14-slim@sha256:fbecd461fc72d21b2143c6eaba25143738079154a6d0ea3da3aec724f50eed4a AS runtime
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: mcp-server-taxcode
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.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
|
|
@@ -16,24 +16,23 @@ Classifier: Intended Audience :: Developers
|
|
|
16
16
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
17
17
|
Classifier: Operating System :: OS Independent
|
|
18
18
|
Classifier: Programming Language :: Python :: 3
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
20
19
|
Classifier: Programming Language :: Python :: 3.11
|
|
21
20
|
Classifier: Programming Language :: Python :: 3.12
|
|
22
21
|
Classifier: Programming Language :: Python :: 3.13
|
|
23
22
|
Classifier: Programming Language :: Python :: 3.14
|
|
24
23
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
25
|
-
Requires-Python: >=3.
|
|
24
|
+
Requires-Python: >=3.11
|
|
26
25
|
Requires-Dist: certifi>=2026.10.19
|
|
27
26
|
Requires-Dist: duckdb>=1.5.6
|
|
28
|
-
Requires-Dist: fastmcp>=4.1.
|
|
27
|
+
Requires-Dist: fastmcp>=4.1.5
|
|
29
28
|
Requires-Dist: httpx>=0.28.1
|
|
30
29
|
Requires-Dist: mcp>=2.3.0
|
|
31
30
|
Requires-Dist: pydantic-settings>=2.15.0
|
|
32
31
|
Requires-Dist: pydantic>=2.13.5
|
|
33
32
|
Provides-Extra: code-mode
|
|
34
|
-
Requires-Dist: fastmcp[code-mode]>=4.1.
|
|
33
|
+
Requires-Dist: fastmcp[code-mode]>=4.1.5; extra == 'code-mode'
|
|
35
34
|
Provides-Extra: dev
|
|
36
|
-
Requires-Dist: fastmcp[code-mode]>=4.1.
|
|
35
|
+
Requires-Dist: fastmcp[code-mode]>=4.1.5; extra == 'dev'
|
|
37
36
|
Requires-Dist: mypy>=2.4.0; extra == 'dev'
|
|
38
37
|
Requires-Dist: opentelemetry-sdk>=1.45.1; extra == 'dev'
|
|
39
38
|
Requires-Dist: pytest-asyncio>=1.4.0; extra == 'dev'
|
|
@@ -70,9 +69,9 @@ graph TD
|
|
|
70
69
|
Gateway["FastMCP Root Gateway<br>(stdio / streamable-http)"]
|
|
71
70
|
ParentMW["Parent Middleware<br>(Audit Logging, Timing, Secret Redaction, ReadOnly Gate)"]
|
|
72
71
|
SysSub["System Sub-server (mount: 'system')<br>• system_get_health_status<br>• taxcode://system/reference/capabilities"]
|
|
73
|
-
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*}"]
|
|
74
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"]
|
|
75
|
-
DuckDB["DuckDB In-Memory & File Engine<br>(
|
|
74
|
+
DuckDB["DuckDB In-Memory & File Engine<br>(235 Statutes, 42 Publications, Full-Text Search, Temporal Versions)"]
|
|
76
75
|
|
|
77
76
|
Client <-->|"JSON-RPC (tools/list, tools/call)"| Gateway
|
|
78
77
|
Gateway --> ParentMW
|
|
@@ -91,14 +90,15 @@ graph TD
|
|
|
91
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).
|
|
92
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).
|
|
93
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.
|
|
94
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.
|
|
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`) 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.
|
|
96
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)).
|
|
97
97
|
* **Temporal Statutory Versioning**: Point-in-time statutory lookup with `superseded_year` filtering and descending historical ordering (`tax_year` parameter).
|
|
98
98
|
* **Deterministic Compliance Engines**:
|
|
99
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.
|
|
100
100
|
* `calculate_built_in_gain_sourcing`: Allocates Section 937 / Act 60 capital gains across pre-move and post-move holding periods.
|
|
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).
|
|
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.
|
|
102
102
|
* **Profiles & Opt-in ToolSearch**:
|
|
103
103
|
* Domain-mount profiles: `full`, `system`, `statutes`, `compliance`, `readonly`.
|
|
104
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).
|