mcp-server-taxcode 1.0.0__tar.gz → 1.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mcp_server_taxcode-1.2.0/.github/CODEOWNERS +1 -0
- mcp_server_taxcode-1.2.0/.github/dependabot.yml +58 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/.github/workflows/ci.yml +55 -18
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/.github/workflows/release.yml +5 -5
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/AGENTS.md +4 -3
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/CONTRIBUTING.md +10 -2
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/Dockerfile +17 -4
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/PKG-INFO +3 -4
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/README.md +1 -1
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/conformance-baseline.yml +10 -6
- mcp_server_taxcode-1.2.0/docker/uv-bootstrap.txt +26 -0
- mcp_server_taxcode-1.2.0/docs/ga/llms-full.txt +64 -0
- mcp_server_taxcode-1.2.0/docs/ga/ocga_48_7_20.md +17 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ga/ocga_48_7_20_2024.md +3 -3
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ga/ocga_48_7_20_2025.md +3 -3
- mcp_server_taxcode-1.2.0/docs/ga/ocga_48_7_27.md +17 -0
- mcp_server_taxcode-1.2.0/docs/id/idaho code_63_3024.md +17 -0
- mcp_server_taxcode-1.2.0/docs/id/llms-full.txt +10 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/llms-full.txt +2 -2
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/llms.txt +25 -5
- mcp_server_taxcode-1.2.0/docs/ms/llms-full.txt +10 -0
- mcp_server_taxcode-1.2.0/docs/ms/miss. code_27_7_5.md +17 -0
- mcp_server_taxcode-1.2.0/docs/ne/llms-full.txt +10 -0
- mcp_server_taxcode-1.2.0/docs/ne/neb. rev. stat._77_2715_03.md +17 -0
- mcp_server_taxcode-1.2.0/docs/oh/llms-full.txt +19 -0
- mcp_server_taxcode-1.2.0/docs/oh/r.c._5747_02.md +17 -0
- mcp_server_taxcode-1.2.0/docs/pr/cri_1031_02_2019.md +25 -0
- mcp_server_taxcode-1.2.0/docs/pr/cri_1062_01_2019.md +25 -0
- mcp_server_taxcode-1.2.0/docs/pr/cri_1062_03_2019.md +27 -0
- mcp_server_taxcode-1.2.0/docs/pr/ley60_1020_02_2019.md +48 -0
- mcp_server_taxcode-1.2.0/docs/pr/ley60_1020_02_2020.md +25 -0
- mcp_server_taxcode-1.2.0/docs/pr/ley60_2022_02_2019.md +20 -0
- mcp_server_taxcode-1.2.0/docs/pr/ley60_6020_03_2019.md +22 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_6020_10.md +4 -3
- mcp_server_taxcode-1.2.0/docs/pr/ley60_6020_10_2019.md +40 -0
- mcp_server_taxcode-1.2.0/docs/pr/ley60_6020_10_2020.md +32 -0
- mcp_server_taxcode-1.2.0/docs/pr/ley60_6020_10_2022.md +32 -0
- mcp_server_taxcode-1.0.0/docs/pr/ley60_6020_10_2019.md → mcp_server_taxcode-1.2.0/docs/pr/ley60_6020_10_2024.md +10 -8
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_6020_10_2025.md +5 -4
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/llms-full.txt +232 -12
- mcp_server_taxcode-1.2.0/docs/us/cfr_1_937_3_2019.md +39 -0
- mcp_server_taxcode-1.2.0/docs/us/irc_1_2019.md +22 -0
- mcp_server_taxcode-1.2.0/docs/us/irc_1_2020.md +403 -0
- mcp_server_taxcode-1.2.0/docs/us/irc_24_2019.md +101 -0
- mcp_server_taxcode-1.2.0/docs/us/irc_24_2021.md +186 -0
- mcp_server_taxcode-1.2.0/docs/us/irc_32_2019.md +151 -0
- mcp_server_taxcode-1.2.0/docs/us/irc_62_2019.md +136 -0
- mcp_server_taxcode-1.2.0/docs/us/irc_62_2020.md +23 -0
- mcp_server_taxcode-1.2.0/docs/us/irc_62_2021.md +135 -0
- mcp_server_taxcode-1.2.0/docs/us/irc_63_2019.md +100 -0
- mcp_server_taxcode-1.2.0/docs/us/irc_63_2021.md +100 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/llms-full.txt +1431 -123
- mcp_server_taxcode-1.2.0/docs/ut/llms-full.txt +10 -0
- mcp_server_taxcode-1.2.0/docs/ut/utah code_59_10_104.md +17 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/wa/llms-full.txt +2 -2
- mcp_server_taxcode-1.2.0/docs/wa/rcw_82_87_040.md +17 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/pyproject.toml +3 -4
- mcp_server_taxcode-1.2.0/scripts/build_corrected_pins.py +73 -0
- mcp_server_taxcode-1.2.0/scripts/build_prior_years_pins.py +255 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/scripts/check_tool_contract.py +35 -8
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/scripts/setup_repo_governance.sh +2 -3
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/catalog.py +381 -22
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/client.py +23 -4
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/federal/standard_deduction.json +48 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/al.json +4 -4
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/ar.json +4 -4
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/az.json +4 -4
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/co.json +97 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/dc.json +4 -4
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/de.json +4 -4
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/ga.json +49 -25
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/hi.json +4 -4
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/ia.json +4 -4
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/id.json +83 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/il.json +4 -4
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/in.json +4 -4
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/ks.json +4 -4
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ky.json +77 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/la.json +4 -4
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ma.json +100 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/me.json +3 -3
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/mi.json +3 -3
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/mn.json +4 -4
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/mo.json +4 -4
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ms.json +164 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/mt.json +4 -4
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/nc.json +4 -4
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/nd.json +4 -4
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ne.json +138 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/nm.json +4 -4
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/oh.json +102 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/ok.json +4 -4
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/or.json +4 -4
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/pa.json +4 -4
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/pr.json +136 -6
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ri.json +75 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/sc.json +4 -4
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/us.json +246 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ut.json +88 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/va.json +4 -4
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/vt.json +3 -3
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/wa.json +102 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/wi.json +4 -4
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/wv.json +4 -4
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/publications/ga.json +15 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/al.json +44 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/ar.json +6 -5
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/az.json +1 -1
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/co.json +46 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/dc.json +76 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/de.json +76 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ga.json +53 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/hi.json +118 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ia.json +46 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/id.json +62 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/il.json +1 -1
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/in.json +1 -1
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ks.json +36 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ky.json +20 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/la.json +31 -4
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ma.json +29 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/me.json +44 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/mi.json +1 -1
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/mn.json +52 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/mo.json +84 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ms.json +174 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/mt.json +36 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/nc.json +2 -2
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/nd.json +1 -1
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ne.json +214 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/nm.json +63 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/oh.json +110 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ok.json +68 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/or.json +53 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/pa.json +9 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ri.json +108 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/sc.json +44 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ut.json +27 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/va.json +1 -1
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/vt.json +52 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/wa.json +16 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/wi.json +52 -0
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/wv.json +60 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ga.json +11 -11
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/id.json +2 -2
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ms.json +2 -2
- mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/statutes/ne.json +26 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/oh.json +2 -2
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/pr.json +374 -17
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/us.json +1845 -382
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ut.json +2 -2
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/wa.json +2 -2
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/db.py +103 -6
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/disclaimers.py +20 -3
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/tools/compliance.py +343 -59
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/tools/statutes.py +11 -1
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/tools/system.py +1 -1
- mcp_server_taxcode-1.2.0/tests/fixtures/compliance_golden/compliance_evaluate_georgia_residency.jsonl.gz +0 -0
- mcp_server_taxcode-1.2.0/tests/fixtures/compliance_golden/compliance_evaluate_state_residency.jsonl.gz +0 -0
- mcp_server_taxcode-1.2.0/tests/fixtures/prior_years/corrected_answers.json +258 -0
- mcp_server_taxcode-1.2.0/tests/fixtures/prior_years/f4f0d5d_pins.json.gz +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_batch.py +34 -0
- mcp_server_taxcode-1.2.0/tests/test_catalog.py +822 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_client.py +123 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_code_mode_extra.py +1 -5
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_db.py +66 -19
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_dockerfile.py +71 -2
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_ingest.py +109 -9
- mcp_server_taxcode-1.2.0/tests/test_notfound_pointer.py +205 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_paging.py +10 -3
- mcp_server_taxcode-1.2.0/tests/test_prior_years.py +607 -0
- mcp_server_taxcode-1.2.0/tests/test_prior_years_pin.py +335 -0
- mcp_server_taxcode-1.2.0/tests/test_prior_years_pr.py +616 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_protocol.py +13 -0
- mcp_server_taxcode-1.2.0/tests/test_rate_prose.py +83 -0
- mcp_server_taxcode-1.2.0/tests/test_rate_tables.py +1232 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_search_normalize.py +8 -1
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_server.py +28 -26
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/uv.lock +71 -553
- mcp_server_taxcode-1.0.0/.github/dependabot.yml +0 -36
- mcp_server_taxcode-1.0.0/.github/workflows/drift-monitor.yml +0 -47
- mcp_server_taxcode-1.0.0/docs/ga/llms-full.txt +0 -64
- mcp_server_taxcode-1.0.0/docs/ga/ocga_48_7_20.md +0 -17
- mcp_server_taxcode-1.0.0/docs/ga/ocga_48_7_27.md +0 -17
- mcp_server_taxcode-1.0.0/docs/id/idaho code_63_3024.md +0 -17
- mcp_server_taxcode-1.0.0/docs/id/llms-full.txt +0 -10
- mcp_server_taxcode-1.0.0/docs/ms/llms-full.txt +0 -10
- mcp_server_taxcode-1.0.0/docs/ms/miss. code_27_7_5.md +0 -17
- mcp_server_taxcode-1.0.0/docs/ne/llms-full.txt +0 -10
- mcp_server_taxcode-1.0.0/docs/ne/neb. rev. stat._77_2715_03.md +0 -17
- mcp_server_taxcode-1.0.0/docs/oh/llms-full.txt +0 -19
- mcp_server_taxcode-1.0.0/docs/oh/r.c._5747_02.md +0 -17
- mcp_server_taxcode-1.0.0/docs/ut/llms-full.txt +0 -10
- mcp_server_taxcode-1.0.0/docs/ut/utah code_59_10_104.md +0 -17
- mcp_server_taxcode-1.0.0/docs/wa/rcw_82_87_040.md +0 -17
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/co.json +0 -45
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/id.json +0 -32
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ky.json +0 -32
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ma.json +0 -58
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ms.json +0 -32
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ne.json +0 -32
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/oh.json +0 -58
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ri.json +0 -32
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ut.json +0 -32
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/wa.json +0 -58
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/publications/ga.json +0 -24
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/al.json +0 -17
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/co.json +0 -13
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/dc.json +0 -17
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/de.json +0 -17
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ga.json +0 -36
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/hi.json +0 -19
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ia.json +0 -19
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/id.json +0 -16
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ks.json +0 -15
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ky.json +0 -15
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ma.json +0 -17
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/me.json +0 -17
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/mn.json +0 -17
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/mo.json +0 -17
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ms.json +0 -15
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/mt.json +0 -17
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ne.json +0 -17
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/nm.json +0 -20
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/oh.json +0 -48
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ok.json +0 -17
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/or.json +0 -18
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/pa.json +0 -9
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ri.json +0 -17
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/sc.json +0 -17
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ut.json +0 -15
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/vt.json +0 -17
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/wa.json +0 -10
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/wi.json +0 -17
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/wv.json +0 -17
- mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/ne.json +0 -26
- mcp_server_taxcode-1.0.0/tests/fixtures/compliance_golden/compliance_evaluate_georgia_residency.jsonl.gz +0 -0
- mcp_server_taxcode-1.0.0/tests/fixtures/compliance_golden/compliance_evaluate_state_residency.jsonl.gz +0 -0
- mcp_server_taxcode-1.0.0/tests/test_catalog.py +0 -461
- mcp_server_taxcode-1.0.0/tests/test_rate_tables.py +0 -192
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/.github/workflows/dependabot-automerge.yml +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/.gitignore +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/CHANGELOG.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/CODE_OF_CONDUCT.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/LICENSE +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/SECURITY.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docker/pip-bootstrap.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ak/alaska stat._43_05_080.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ak/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/al/ala. code_40_18_2.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/al/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ar/a.c.a._26_51_201.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ar/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/az/a.r.s._43_1011.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/az/a.r.s._43_104.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/az/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ca/caccr_17014.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ca/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ca/rtc_17014.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ca/rtc_17041.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ca/rtc_17951.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/co/c.r.s._39_22_103.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/co/c.r.s._39_22_104.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/co/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ct/c.g.s._12_700.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ct/c.g.s._12_701.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ct/c.g.s._12_711.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ct/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/dc/d.c. code_47_1806_03.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/dc/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/de/del. code_1102.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/de/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/fl/flconst_art__vii_sec__5.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/fl/flstat_196_031.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/fl/flstat_222_17.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/fl/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ga/gareg_560_7_3__01.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ga/ocga_48_7_1.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ga/ocga_48_7_30.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/hi/hrs_235_51.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/hi/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ia/iowa code_422_5.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ia/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/il/ilcs_5_1501_a_20.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/il/ilcs_5_201.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/il/ilcs_5_301.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/il/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/in/ind. code_6_3_2_1.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/in/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ks/k.s.a._79_32,110.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ks/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ky/krs_141_020.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ky/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/la/la. r.s._47_32.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/la/la. r.s._47_32_2022.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/la/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ma/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ma/maconst_art__xliv.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ma/mgl_62_1_f.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ma/mgl_62_4.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/md/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/md/md. code_10_101.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/md/md. code_10_105.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/md/md. code_10_106.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/me/36 m.r.s._5111.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/me/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/mi/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/mi/mcl_206_51.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/mn/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/mn/minn. stat._290_06.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/mo/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/mo/rsmo_143_011.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/mt/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/mt/mca_15_30_2103.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nc/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nc/n.c.g.s._105_153_3.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nc/n.c.g.s._105_153_7.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nd/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nd/n.d.c.c._57_38_30_3.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nh/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nh/rsa_77_1_2024.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nj/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nj/njac_18_35_5_2.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nj/njsa_54a_1_2.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nj/njsa_54a_2_1.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nm/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nm/nmsa_7_2_7.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nv/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nv/nev. const._art__10,_/302/247_1.md" +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ny/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ny/nycrr_105_20.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ny/nycrr_132_18.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ny/nytax_601.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ny/nytax_605.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/oh/r.c._5747_24.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ok/68 o.s._2355.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ok/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/or/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/or/ors_316_037.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pa/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pa/p.s._7301.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pa/p.s._7302.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pa/pa. code_109_8.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/cri_1010_01.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/cri_1031_01.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/cri_1031_02.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/cri_1062_01.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/cri_1062_03.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley22_3_2012.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_1020_02.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_2021_01.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_2022_01.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_2022_01_2019.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_2022_02.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_2031_01.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_2032_01.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_6020_03.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_6070_55.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ri/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ri/r.i.g.l._44_30_1.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/sc/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/sc/s.c. code_12_6_510.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/sd/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/sd/s.d. const._art__xi,_/302/247_2.md" +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/tn/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/tn/tenn. const._art__ii,_/302/247_28.md" +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/tx/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/tx/txconst_art__viii_sec__24_a.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/tx/txtax_171_001.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/cfr_1_937_1.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/cfr_1_937_2.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/cfr_1_937_3.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_1.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_1411.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_24.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_32.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_6012.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_61.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_62.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_63.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_6688.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_865.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_911.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_933.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_937.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_957.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/va/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/va/va. code_58_1_302.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/va/va. code_58_1_320.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/va/va. code_58_1_342.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/vt/32 v.s.a._5822.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/vt/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/wa/rcw_82_87_020.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/wa/waconst_art__vii_sec__1.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/wi/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/wi/wis. stat._71_06.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/wv/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/wv/w. va. code_11_21_4e.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/wy/llms-full.txt +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/wy/wyo. const._art__15,_/302/247_18.md" +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/fastmcp.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/scripts/build_catalog.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/scripts/check_conformance.sh +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/scripts/check_openapi_drift.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/scripts/check_version.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/scripts/ingest_statutes.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/scripts/release_notes.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/server.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/skills/taxcode-mcp/SKILL.md +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/__init__.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/auth.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/config.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/jurisdictions.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/ak.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/ca.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/ct.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/fl.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/md.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/nh.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/nj.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/nv.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/ny.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/sd.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/tn.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/tx.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/wy.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/publications/md.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/publications/oh.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/publications/pa.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/publications/pr.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/publications/us.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/publications/va.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/ak.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/ca.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/ct.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/md.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/nh.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/nj.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/nv.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/ny.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/sd.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/tn.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/wy.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ak.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/al.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ar.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/az.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ca.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/co.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ct.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/dc.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/de.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/fl.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/hi.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ia.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/il.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/in.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ks.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ky.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/la.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ma.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/md.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/me.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/mi.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/mn.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/mo.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/mt.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/nc.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/nd.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/nh.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/nj.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/nm.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/nv.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ny.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ok.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/or.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/pa.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ri.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/sc.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/sd.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/tn.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/tx.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/va.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/vt.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/wi.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/wv.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/wy.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/errors.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/middleware.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/paging.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/profiles.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/server.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/ssrf.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/tools/__init__.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/conftest.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/fake_network.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/fixtures/compliance_golden/compliance_calculate_built_in_gain_sourcing.jsonl.gz +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/fixtures/compliance_golden/compliance_cross_border_tax_analysis.jsonl.gz +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/fixtures/compliance_golden/compliance_evaluate_pr_bona_fide_residency.jsonl.gz +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/fixtures/compliance_golden/constants.json +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/fixtures/usc26_sample.xml +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/golden_compliance.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_check_version.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_compliance_golden.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_config.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_conftest_auth_env.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_disclaimers.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_drift.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_e2e_live.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_errors.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_federal.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_http_auth.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_layered.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_network_guard.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_otel_spans.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_profiles.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_release_notes.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_search_snippets.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_ssrf.py +0 -0
- {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.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@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
|
|
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@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
|
|
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@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
|
|
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@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
|
|
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
|
|
@@ -223,3 +228,35 @@ jobs:
|
|
|
223
228
|
exit 1
|
|
224
229
|
fi
|
|
225
230
|
echo "Builder stops at the ca-certificates floor check before any pip step"
|
|
231
|
+
|
|
232
|
+
drift-check:
|
|
233
|
+
name: Check API Drift
|
|
234
|
+
# Scheduled and manual runs only; pushes and pull requests skip it.
|
|
235
|
+
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
|
|
236
|
+
permissions:
|
|
237
|
+
contents: read
|
|
238
|
+
runs-on: ubuntu-latest
|
|
239
|
+
steps:
|
|
240
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
241
|
+
with:
|
|
242
|
+
fetch-depth: 0
|
|
243
|
+
persist-credentials: false
|
|
244
|
+
|
|
245
|
+
- name: Install uv
|
|
246
|
+
uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
|
|
247
|
+
with:
|
|
248
|
+
# Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
|
|
249
|
+
# FastMCP's October 2026 certificate authority incident notice).
|
|
250
|
+
version-file: "pyproject.toml"
|
|
251
|
+
enable-cache: true
|
|
252
|
+
|
|
253
|
+
- name: Set up Python
|
|
254
|
+
uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
|
|
255
|
+
with:
|
|
256
|
+
python-version: "3.11"
|
|
257
|
+
|
|
258
|
+
- name: Install dependencies
|
|
259
|
+
run: uv sync --locked --extra dev --python 3.11
|
|
260
|
+
|
|
261
|
+
- name: Run OpenAPI drift detection
|
|
262
|
+
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@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
|
|
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,7 +94,7 @@ 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
100
|
uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3.0.3
|
|
@@ -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@81c6f93d4bc991e510b342a00b419b3bb4efc5c6 # v4.7.0
|
|
126
126
|
with:
|
|
127
127
|
registry: ghcr.io
|
|
128
128
|
username: ${{ github.actor }}
|
|
@@ -50,7 +50,7 @@ Host configuration JSON for these doc servers (`mcp_config.json` and other deskt
|
|
|
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 with `pip install --no-deps .`. Never install the project with its dependencies (`pip install .`), which resolves them fresh at build time. Dependabot's weekly `uv` updates bump the uv pin and rewrite its sha256 values, writing one for every wheel and the sdist published for that version. Whoever changes `[tool.uv] required-version` keeps the uv pin within it, and a hand bump takes a sha256 for every wheel and the sdist from `https://pypi.org/pypi/uv/<version>/json` (`digests.sha256`); the manylinux x86_64 and aarch64 wheels are the ones the image build installs. `tests/test_dockerfile.py` enforces the install steps and the pin.
|
|
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).
|
|
@@ -150,7 +151,7 @@ When translating an API documentation page, `llm.txt`, or OpenAPI specification
|
|
|
150
151
|
- `<NAME>_MCP_AUTH_TOKEN` is read with `.strip()`; empty or whitespace-only means no auth plus a warning. When set, every HTTP entry point (`main()`, `fastmcp run`, `http_app()`) requires `Authorization: Bearer <token>` (`SharedTokenVerifier`: constant-time compare, token hidden from `repr`, blank tokens refused).
|
|
151
152
|
- An HTTP transport on a host other than `127.0.0.1`, `::1` or `localhost` refuses to start without a token unless `<NAME>_MCP_ALLOW_UNAUTHENTICATED_BIND=1`. Stdio is unaffected and stays the image default (`COOKBOOK.md` Recipe 8).
|
|
152
153
|
6. **SSRF & DNS Rebinding Defense**:
|
|
153
|
-
- Outbound requests must enforce HTTPS, disallow loopback/private/internal IP addresses, and offload DNS hostname verification to worker threads via `asyncio.to_thread` in `SSRFSafeAsyncTransport` to protect event loop responsiveness. The transport then connects only to an address it checked, trying the next checked address if a connect fails, and keeps the hostname in the URL for the Host header, TLS SNI, certificate verification and per-hostname connection pooling, so the name is never looked up a second time. The client, the drift fetch (`--spec-url`) and `ingest_statutes.py --check-upstream` all use it, and none follows redirects. httpx ignores env proxies whenever a transport is passed (`allow_env_proxies = trust_env and transport is None`), so connections always go direct through the pin; egress-proxy deployments need a proxy-aware transport, which isn't provided; `trust_env=False` on the drift fetch and the `--check-upstream` probe is belt-and-braces.
|
|
154
|
+
- Outbound requests must enforce HTTPS, disallow loopback/private/internal IP addresses, and offload DNS hostname verification to worker threads via `asyncio.to_thread` in `SSRFSafeAsyncTransport` to protect event loop responsiveness. The transport then connects only to an address it checked, trying the next checked address if a connect fails while the request's connect timeout lasts (one deadline shared by all the addresses, not a fresh timeout for each), and keeps the hostname in the URL for the Host header, TLS SNI, certificate verification and per-hostname connection pooling, so the name is never looked up a second time. The client, the drift fetch (`--spec-url`) and `ingest_statutes.py --check-upstream` all use it, and none follows redirects. httpx ignores env proxies whenever a transport is passed (`allow_env_proxies = trust_env and transport is None`), so connections always go direct through the pin; egress-proxy deployments need a proxy-aware transport, which isn't provided; `trust_env=False` on the drift fetch and the `--check-upstream` probe is belt-and-braces.
|
|
154
155
|
7. **Defensive API Contracts & Payload Hardening**:
|
|
155
156
|
- Guard against polymorphic nulls and missing keys with typed extraction helpers (`extract_dict`, `extract_list`); never chain naked `.get()` calls without type assertions. Status-classification and selection-loop patterns are in **`COOKBOOK.md`** Recipe 10.
|
|
156
157
|
8. **Git Safety & Streamlined Releases**:
|
|
@@ -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`, 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.
|
|
@@ -27,7 +27,7 @@ Every manifest entry has every field below. A value we don't have is the explici
|
|
|
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,6 +36,7 @@ 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
|
+
| `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 than `url`'s, `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` or `deduction_mfj_2025`, 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). |
|
|
39
40
|
|
|
40
41
|
To add or change a row:
|
|
41
42
|
|
|
@@ -53,7 +54,14 @@ Every deduction, exemption, bracket, rate and per-year value the compliance tool
|
|
|
53
54
|
- `model` names the shape of `params` and which formula reads it. It must match `RATE_TABLE_MODELS`.
|
|
54
55
|
- Amounts and rates are floats (`1000.0`, not `1000`), because tool output prints them as stored.
|
|
55
56
|
- `brackets` and `rates` are lists tried in order: the first step whose `over` the taxable income exceeds (or whose `from_year` the tax year has reached) applies, and the last step's `over` or `from_year` is `null`. Filing-status values are `{"single": ..., "mfj": ...}`.
|
|
56
|
-
- Each
|
|
57
|
+
- 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
|
+
- 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).
|
|
57
59
|
- `registry` tables keep their original keys. A `_YYYY` suffix holds the value from that tax year on, and the unsuffixed key covers the years before. Never copy a current value into an earlier year.
|
|
60
|
+
- The `flat_with_surtax` table's `surtax`, the `capital_gains_excise` table's `capital_gains_deduction` and the `brackets_cumulative` table's `brackets` follow the same convention: `surtax_2024`, `capital_gains_deduction_2024` or `brackets_2025`, after the model's own fields with years ascending for each name, holds the value from that year on, and the unsuffixed key keeps the earlier years. The `capital_gains_excise` table's `tier` (`{"over": ..., "rate": ...}`, an additional rate on the taxable gains over `over`) takes only `tier_YYYY` keys and doesn't apply before the first one. The `georgia` table's `standard_deduction` and `retirement_exclusion` take `_YYYY` keys the same way (`standard_deduction_2026`, `retirement_exclusion_2027`), after `rates`, years ascending. A tax year after `GA_LAST_FIXED_YEAR` (the last year whose deduction and rate HB 463 of 2026 fixes) uses that year's figures and is labeled an estimate, because HB 463's later increases and rate cuts depend on revenue tests.
|
|
61
|
+
- Registry deductions take `_2024`, `_2025` and `_2026`. Registry `brackets` and `rate_desc` take `brackets_YYYY` and `rate_desc_YYYY` for 2024 to 2030, and the four `credit_base_*` / `credit_phaseout_*` amounts take `_2025`. Each needs its unsuffixed key and comes after it, years ascending; `brackets_YYYY` is validated like `brackets` and doesn't count as one of the three graduated keys below. A tax year after `MS_LAST_ENACTED_RATE_YEAR`, `UT_LAST_CREDIT_AMOUNT_YEAR`, `NE_LAST_PUBLISHED_SCHEDULE_YEAR` or `OH_LAST_FIXED_SCHEDULE_YEAR` (tied by tests to the last year each table holds) carries that table's figures forward and is labeled an estimate in its rate prose.
|
|
62
|
+
- A graduated `registry` table says how it taxes income below its top bracket with exactly one of three 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. `middle_rate_estimate: true` keeps the old stand-in of 65% of the top rate where no official schedule fits this model. Every `evaluate_state_residency` answer carries `middle_rate_is_estimate`; it is `true` only for such a table, whose `rate_description` then says so. Never add a new estimate where an official schedule exists.
|
|
63
|
+
- A `registry` table may take a nonrefundable credit off the computed tax, as Utah's taxpayer tax credit does, with all six `credit_*` keys: `credit_rate` times the filing status's `credit_base`, less `credit_phaseout_rate` times the taxable income over its `credit_phaseout` amount, never below zero. Model such a credit as a credit, not as a deduction.
|
|
64
|
+
|
|
65
|
+
- 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.
|
|
58
66
|
|
|
59
67
|
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 /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,26 @@ 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, then the project with
|
|
59
|
+
# --no-deps, so no runtime dependency is resolved at build time.
|
|
60
|
+
# https://docs.astral.sh/uv/concepts/projects/export/ and
|
|
61
|
+
# https://pip.pypa.io/en/stable/topics/secure-installs/
|
|
53
62
|
RUN pip install --no-cache-dir --require-hashes --only-binary=:all: -r /tmp/pip-bootstrap.txt && \
|
|
54
|
-
pip install --no-cache-dir .
|
|
63
|
+
pip install --no-cache-dir --require-hashes --only-binary=:all: --target /tmp/uv -r /tmp/uv-bootstrap.txt && \
|
|
64
|
+
/tmp/uv/bin/uv export --locked --no-dev --no-emit-project --format requirements.txt \
|
|
65
|
+
-o /tmp/requirements.txt && \
|
|
66
|
+
pip install --no-cache-dir --require-hashes --only-binary=:all: -r /tmp/requirements.txt && \
|
|
67
|
+
pip install --no-cache-dir --no-deps .
|
|
55
68
|
|
|
56
69
|
# ─── Stage 2: Runtime ─────────────────────────────────────────────────────────
|
|
57
70
|
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.2.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,13 +16,12 @@ 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
27
|
Requires-Dist: fastmcp>=4.1.3
|
|
@@ -72,7 +71,7 @@ graph TD
|
|
|
72
71
|
SysSub["System Sub-server (mount: 'system')<br>• system_get_health_status<br>• taxcode://system/reference/capabilities"]
|
|
73
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>(143 Statutes, 37 Publications, Full-Text Search, Temporal Versions)"]
|
|
76
75
|
|
|
77
76
|
Client <-->|"JSON-RPC (tools/list, tools/call)"| Gateway
|
|
78
77
|
Gateway --> ParentMW
|
|
@@ -27,7 +27,7 @@ graph TD
|
|
|
27
27
|
SysSub["System Sub-server (mount: 'system')<br>• system_get_health_status<br>• taxcode://system/reference/capabilities"]
|
|
28
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>(143 Statutes, 37 Publications, Full-Text Search, Temporal Versions)"]
|
|
31
31
|
|
|
32
32
|
Client <-->|"JSON-RPC (tools/list, tools/call)"| Gateway
|
|
33
33
|
Gateway --> ParentMW
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
# MCP Conformance Test Suite - Expected Failures Baseline
|
|
2
2
|
# Reference: https://github.com/modelcontextprotocol/conformance
|
|
3
3
|
#
|
|
4
|
-
#
|
|
5
|
-
# 1.
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
# (
|
|
9
|
-
#
|
|
4
|
+
# Each scenario below fails for one of two reasons, neither a defect in this server:
|
|
5
|
+
# 1. It calls a feature this server does not declare, and the server answers
|
|
6
|
+
# -32601 Method not found as the spec requires: completion-complete (no
|
|
7
|
+
# completions capability) and resources-subscribe / resources-unsubscribe
|
|
8
|
+
# (resources.subscribe is false).
|
|
9
|
+
# 2. It calls the conformance suite's own reference-server fixtures (e.g.
|
|
10
|
+
# test_image_content, test_audio_content, test://static-text,
|
|
11
|
+
# test_simple_prompt), which this server does not have: the other 17
|
|
12
|
+
# tools-call-*, elicitation-*, resources-read-* / resources-templates-read
|
|
13
|
+
# and prompts-get-* scenarios.
|
|
10
14
|
|
|
11
15
|
server:
|
|
12
16
|
- completion-complete
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# uv for the Dockerfile builder, which only runs `uv export` to turn uv.lock into a requirements
|
|
2
|
+
# file with hashes. Installed with --require-hashes, so the install does not depend on TLS trust.
|
|
3
|
+
# Hashes are digests.sha256 from PyPI's JSON API (https://pypi.org/pypi/uv/<version>/json) for
|
|
4
|
+
# every file published for the pinned version: each wheel and the sdist. Dependabot's uv updates
|
|
5
|
+
# bump the pin and rewrite the hashes. Keep the version within pyproject.toml's [tool.uv]
|
|
6
|
+
# required-version, and bump the pin and hashes together when editing the file by hand.
|
|
7
|
+
uv==0.13.5 \
|
|
8
|
+
--hash=sha256:0548460d46c8667488b1f089e936f29f0edfb1cc753f9152ffbd8bc84a46aa20 \
|
|
9
|
+
--hash=sha256:0e03f5717bdaaf5ab4e2df361d2395e36b515946f56ef4bed88801aeb9959fb0 \
|
|
10
|
+
--hash=sha256:1fb29fc46ba12033e2ef95a95ac79d649e71bbb1358419bbbcbd19d86026ef2f \
|
|
11
|
+
--hash=sha256:2386c2dc9b59fc1d39b1c500e4319d71d3268232eb3b38e29cd6775d6269e8d4 \
|
|
12
|
+
--hash=sha256:2386e8dbfe110ff2f8ec8bd344dd18bf39eb9eb54e1edeeb87c3b85c34229cd3 \
|
|
13
|
+
--hash=sha256:309a74d3c488bfaa3ba7bff759da73193d8781729c0a01274f4940fd32bb5712 \
|
|
14
|
+
--hash=sha256:337a14829bb499e114989df4f908f134ff37f1fb6c33497541cfb05b28080e39 \
|
|
15
|
+
--hash=sha256:469cca66de1b17c75b9b9de806a64cffb57cba5e42b1e30d0bba6fa72a146f58 \
|
|
16
|
+
--hash=sha256:4f62680fe58c5a83fd539e38f1956c2b577b1f5939c9020aa4c7f0addda2f4ad \
|
|
17
|
+
--hash=sha256:8d092d07d2389909027c2ed4965ade1bd46bbcecceb26686ff40927684f8c457 \
|
|
18
|
+
--hash=sha256:91e58e304b63b6c91bac5561459ab0c3ea24f17bc01ea9359d69fed72142978f \
|
|
19
|
+
--hash=sha256:979409b8c9a78df140ffb19c53f511b7a73526da8d1d5e36558833055e371c6c \
|
|
20
|
+
--hash=sha256:a42c85fa8156e1e5e2cecdbc77bb818ea1dcf5f78b8e2a8f84c7fe4f16f0702e \
|
|
21
|
+
--hash=sha256:d162669e3a7811c584b03690eaa11e796ad1d309aa8229d5dfe3cbcd68a90400 \
|
|
22
|
+
--hash=sha256:d3fd5db55c20feb672ea457361aba29ab68b9ae69a14d98ad6c138b5f86dcca4 \
|
|
23
|
+
--hash=sha256:e01481ae5212e45ee7c85fad5fc67f06b0ee0329a7c3c289dc529da884b03881 \
|
|
24
|
+
--hash=sha256:f4e55a6e2a1089fe74ed50fbdf2df0f6f336ee148ad232b05932db5deee8007e \
|
|
25
|
+
--hash=sha256:f867c5ec24c563afaae730a13e46cdf74a1a0b64c134286ff99762a96e2abf40 \
|
|
26
|
+
--hash=sha256:fa8d26e08e34c29c0c4e820cf3181757086d547240b4f4d31ff1d8bd810ca946
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Full Statutory Corpus: GA
|
|
2
|
+
|
|
3
|
+
## O.C.G.A. § 48-7-1: Income Tax Definitions / Residency Rules
|
|
4
|
+
`O.C.G.A. > Title 48 > Chapter 7 > Article 1 > § 48-7-1`
|
|
5
|
+
|
|
6
|
+
### English
|
|
7
|
+
Defines Georgia resident as any individual who is a legal resident of Georgia on income tax day, who resides within the state for 183 days or more in the aggregate during the taxable year, or who maintains a permanent place of abode within the state.
|
|
8
|
+
|
|
9
|
+
### Español
|
|
10
|
+
Define residente de Georgia como todo individuo con residencia legal en Georgia el día de pago del impuesto, que resida en el estado al menos 183 días del año contributivo, o que mantenga una vivienda permanente.
|
|
11
|
+
|
|
12
|
+
## O.C.G.A. § 48-7-20: Individual Income Tax Rates (2024 Flat Rate: 5.39%)
|
|
13
|
+
`O.C.G.A. > Title 48 > Chapter 7 > Article 2 > § 48-7-20 (2024)`
|
|
14
|
+
|
|
15
|
+
### English
|
|
16
|
+
Imposes a flat individual income tax rate of 5.39% on Georgia taxable net income for tax year 2024 pursuant to HB 1015 (2024), which lowered the 5.49% rate previously set for 2024; graduated brackets no longer apply.
|
|
17
|
+
|
|
18
|
+
### Español
|
|
19
|
+
Establece una tasa impositiva fija (flat tax) de 5.39% sobre el ingreso neto tributable de individuos para el año contributivo 2024 bajo HB 1015 (2024), que redujo la tasa de 5.49% fijada previamente para 2024; ya no se aplican tramos graduados.
|
|
20
|
+
|
|
21
|
+
## O.C.G.A. § 48-7-20: Individual Income Tax Rates (2025 Flat Rate: 5.19%)
|
|
22
|
+
`O.C.G.A. > Title 48 > Chapter 7 > Article 2 > § 48-7-20 (2025)`
|
|
23
|
+
|
|
24
|
+
### English
|
|
25
|
+
Accelerates the reduction of the flat individual income tax rate to 5.19% for tax year 2025 pursuant to HB 111 (2025).
|
|
26
|
+
|
|
27
|
+
### Español
|
|
28
|
+
Acelera la reducción de la tasa impositiva individual fija al 5.19% para el año contributivo 2025 bajo HB 111 (2025).
|
|
29
|
+
|
|
30
|
+
## O.C.G.A. § 48-7-20: Individual Income Tax Rates (2026 Flat Rate: 4.99%)
|
|
31
|
+
`O.C.G.A. > Title 48 > Chapter 7 > Article 2 > § 48-7-20 (2026)`
|
|
32
|
+
|
|
33
|
+
### English
|
|
34
|
+
Imposes a flat individual income tax rate of 4.99% for taxable years beginning on or after January 1, 2026 pursuant to HB 463 of 2026, with annual reductions of 0.125 percent beginning January 1, 2027 until the rate reaches 3.99%, subject to the statute's revenue conditions.
|
|
35
|
+
|
|
36
|
+
### Español
|
|
37
|
+
Establece una tasa impositiva fija de 4.99% sobre el ingreso neto tributable para los años contributivos que comienzan el 1 de enero de 2026 o después bajo HB 463 de 2026, con reducciones anuales de 0.125 por ciento a partir del 1 de enero de 2027 hasta llegar a 3.99%, sujetas a las condiciones de recaudación de la ley.
|
|
38
|
+
|
|
39
|
+
## O.C.G.A. § 48-7-27: Computation of Georgia Taxable Net Income
|
|
40
|
+
`O.C.G.A. > Title 48 > Chapter 7 > Article 2 > § 48-7-27`
|
|
41
|
+
|
|
42
|
+
### English
|
|
43
|
+
Calculates Georgia taxable net income from Federal AGI. The standard deduction is $12,000 (single, head of household, qualifying surviving spouse or married filing separately) or $24,000 (married filing jointly) for tax years 2024 and 2025, and $15,000 or $30,000 from tax year 2026 under HB 463 of 2026; beginning January 1, 2027 it increases by $375 or $750 a year until it reaches $18,000 or $36,000, subject to the statute's revenue-condition delays. The retirement income exclusion is up to $35,000 per taxpayer for ages 62-64, or under 62 and permanently disabled to such an extent that they are unable to perform any type of gainful employment, and up to $65,000 per taxpayer age 65 or older, rising to $70,000 per taxpayer age 65 or older for taxable years beginning on or after January 1, 2027 under HB 463 of 2026.
|
|
44
|
+
|
|
45
|
+
### Español
|
|
46
|
+
Dispone el cálculo del ingreso neto gravable de Georgia a partir del AGI federal. La deducción estándar es de $12,000 (solteros, cabezas de familia, cónyuges sobrevivientes que califican o casados que declaran por separado) o $24,000 (casados que declaran conjuntamente) para los años contributivos 2024 y 2025, y de $15,000 o $30,000 a partir del año contributivo 2026 bajo HB 463 de 2026; a partir del 1 de enero de 2027 aumenta $375 o $750 por año hasta llegar a $18,000 o $36,000, sujeta a los aplazamientos por condiciones de recaudación de la ley. La exclusión de ingresos de jubilación es de hasta $35,000 por contribuyente de 62 a 64 años, o menor de 62 años con incapacidad permanente de tal grado que no puede realizar ningún tipo de empleo remunerado, y de hasta $65,000 por contribuyente de 65 años o más, y sube a $70,000 por contribuyente de 65 años o más para los años contributivos que comienzan el 1 de enero de 2027 o después bajo HB 463 de 2026.
|
|
47
|
+
|
|
48
|
+
## O.C.G.A. § 48-7-30: Taxation of Nonresidents
|
|
49
|
+
`O.C.G.A. > Title 48 > Chapter 7 > Article 2 > § 48-7-30`
|
|
50
|
+
|
|
51
|
+
### English
|
|
52
|
+
Taxes nonresidents on gross income derived from Georgia sources, including compensation for services performed within Georgia, property located in Georgia, and business conducted in the state.
|
|
53
|
+
|
|
54
|
+
### Español
|
|
55
|
+
Grava a personas no residentes sobre su ingreso bruto derivado de fuentes de Georgia, incluyendo compensación por servicios realizados en Georgia y actividades comerciales locales.
|
|
56
|
+
|
|
57
|
+
## Ga. Comp. R. & Regs. r. 560-7-3-.01: Residence and Domicile
|
|
58
|
+
`Ga. Comp. R. & Regs. > Chapter 560-7 > Subject 560-7-3 > Rule 560-7-3-.01`
|
|
59
|
+
|
|
60
|
+
### English
|
|
61
|
+
Georgia Department of Revenue rule governing residence and legal domicile. Domicile in Georgia is presumed to continue until the taxpayer establishes abandonment and acquisition of a permanent domicile elsewhere.
|
|
62
|
+
|
|
63
|
+
### Español
|
|
64
|
+
Reglamento del Departamento de Ingresos de Georgia sobre domicilio y residencia. El domicilio en Georgia se presume continuo a menos que el contribuyente demuestre abandono definitivo y adquisición de nuevo domicilio.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# O.C.G.A. § 48-7-20 — Individual Income Tax Rates (2026 Flat Rate: 4.99%)
|
|
2
|
+
|
|
3
|
+
- **Jurisdiction:** GA
|
|
4
|
+
- **Corpus:** OCGA
|
|
5
|
+
- **Effective Year:** 2026
|
|
6
|
+
- **Superseded Year:** Current / In Force
|
|
7
|
+
- **Source:** [https://dor.georgia.gov/taxes/taxes-individuals](https://dor.georgia.gov/taxes/taxes-individuals)
|
|
8
|
+
- **Hierarchy:** `O.C.G.A. > Title 48 > Chapter 7 > Article 2 > § 48-7-20 (2026)`
|
|
9
|
+
- **Cross References:** `O.C.G.A. § 48-7-1`, `O.C.G.A. § 48-7-27`
|
|
10
|
+
|
|
11
|
+
## Operative Statutory Language (English)
|
|
12
|
+
|
|
13
|
+
Imposes a flat individual income tax rate of 4.99% for taxable years beginning on or after January 1, 2026 pursuant to HB 463 of 2026, with annual reductions of 0.125 percent beginning January 1, 2027 until the rate reaches 3.99%, subject to the statute's revenue conditions.
|
|
14
|
+
|
|
15
|
+
## Texto Estatutario Oficial (Español)
|
|
16
|
+
|
|
17
|
+
Establece una tasa impositiva fija de 4.99% sobre el ingreso neto tributable para los años contributivos que comienzan el 1 de enero de 2026 o después bajo HB 463 de 2026, con reducciones anuales de 0.125 por ciento a partir del 1 de enero de 2027 hasta llegar a 3.99%, sujetas a las condiciones de recaudación de la ley.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# O.C.G.A. § 48-7-20 — Individual Income Tax Rates (2024 Flat Rate: 5.
|
|
1
|
+
# O.C.G.A. § 48-7-20 — Individual Income Tax Rates (2024 Flat Rate: 5.39%)
|
|
2
2
|
|
|
3
3
|
- **Jurisdiction:** GA
|
|
4
4
|
- **Corpus:** OCGA
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
|
|
11
11
|
## Operative Statutory Language (English)
|
|
12
12
|
|
|
13
|
-
Imposes a flat individual income tax rate of 5.
|
|
13
|
+
Imposes a flat individual income tax rate of 5.39% on Georgia taxable net income for tax year 2024 pursuant to HB 1015 (2024), which lowered the 5.49% rate previously set for 2024; graduated brackets no longer apply.
|
|
14
14
|
|
|
15
15
|
## Texto Estatutario Oficial (Español)
|
|
16
16
|
|
|
17
|
-
Establece una tasa impositiva fija (flat tax) de 5.
|
|
17
|
+
Establece una tasa impositiva fija (flat tax) de 5.39% sobre el ingreso neto tributable de individuos para el año contributivo 2024 bajo HB 1015 (2024), que redujo la tasa de 5.49% fijada previamente para 2024; ya no se aplican tramos graduados.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# O.C.G.A. § 48-7-20 — Individual Income Tax Rates (2025 Flat Rate: 5.
|
|
1
|
+
# O.C.G.A. § 48-7-20 — Individual Income Tax Rates (2025 Flat Rate: 5.19%)
|
|
2
2
|
|
|
3
3
|
- **Jurisdiction:** GA
|
|
4
4
|
- **Corpus:** OCGA
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
|
|
11
11
|
## Operative Statutory Language (English)
|
|
12
12
|
|
|
13
|
-
Accelerates the reduction of the flat individual income tax rate to 5.
|
|
13
|
+
Accelerates the reduction of the flat individual income tax rate to 5.19% for tax year 2025 pursuant to HB 111 (2025).
|
|
14
14
|
|
|
15
15
|
## Texto Estatutario Oficial (Español)
|
|
16
16
|
|
|
17
|
-
Acelera la reducción de la tasa impositiva individual fija al 5.
|
|
17
|
+
Acelera la reducción de la tasa impositiva individual fija al 5.19% para el año contributivo 2025 bajo HB 111 (2025).
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# O.C.G.A. § 48-7-27 — Computation of Georgia Taxable Net Income
|
|
2
|
+
|
|
3
|
+
- **Jurisdiction:** GA
|
|
4
|
+
- **Corpus:** OCGA
|
|
5
|
+
- **Effective Year:** 2024
|
|
6
|
+
- **Superseded Year:** Current / In Force
|
|
7
|
+
- **Source:** [https://dor.georgia.gov/taxes/taxes-individuals](https://dor.georgia.gov/taxes/taxes-individuals)
|
|
8
|
+
- **Hierarchy:** `O.C.G.A. > Title 48 > Chapter 7 > Article 2 > § 48-7-27`
|
|
9
|
+
- **Cross References:** `O.C.G.A. § 48-7-20`, `26 U.S.C. § 62`
|
|
10
|
+
|
|
11
|
+
## Operative Statutory Language (English)
|
|
12
|
+
|
|
13
|
+
Calculates Georgia taxable net income from Federal AGI. The standard deduction is $12,000 (single, head of household, qualifying surviving spouse or married filing separately) or $24,000 (married filing jointly) for tax years 2024 and 2025, and $15,000 or $30,000 from tax year 2026 under HB 463 of 2026; beginning January 1, 2027 it increases by $375 or $750 a year until it reaches $18,000 or $36,000, subject to the statute's revenue-condition delays. The retirement income exclusion is up to $35,000 per taxpayer for ages 62-64, or under 62 and permanently disabled to such an extent that they are unable to perform any type of gainful employment, and up to $65,000 per taxpayer age 65 or older, rising to $70,000 per taxpayer age 65 or older for taxable years beginning on or after January 1, 2027 under HB 463 of 2026.
|
|
14
|
+
|
|
15
|
+
## Texto Estatutario Oficial (Español)
|
|
16
|
+
|
|
17
|
+
Dispone el cálculo del ingreso neto gravable de Georgia a partir del AGI federal. La deducción estándar es de $12,000 (solteros, cabezas de familia, cónyuges sobrevivientes que califican o casados que declaran por separado) o $24,000 (casados que declaran conjuntamente) para los años contributivos 2024 y 2025, y de $15,000 o $30,000 a partir del año contributivo 2026 bajo HB 463 de 2026; a partir del 1 de enero de 2027 aumenta $375 o $750 por año hasta llegar a $18,000 o $36,000, sujeta a los aplazamientos por condiciones de recaudación de la ley. La exclusión de ingresos de jubilación es de hasta $35,000 por contribuyente de 62 a 64 años, o menor de 62 años con incapacidad permanente de tal grado que no puede realizar ningún tipo de empleo remunerado, y de hasta $65,000 por contribuyente de 65 años o más, y sube a $70,000 por contribuyente de 65 años o más para los años contributivos que comienzan el 1 de enero de 2027 o después bajo HB 463 de 2026.
|