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.
Files changed (520) hide show
  1. mcp_server_taxcode-1.2.0/.github/CODEOWNERS +1 -0
  2. mcp_server_taxcode-1.2.0/.github/dependabot.yml +58 -0
  3. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/.github/workflows/ci.yml +55 -18
  4. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/.github/workflows/release.yml +5 -5
  5. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/AGENTS.md +4 -3
  6. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/CONTRIBUTING.md +10 -2
  7. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/Dockerfile +17 -4
  8. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/PKG-INFO +3 -4
  9. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/README.md +1 -1
  10. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/conformance-baseline.yml +10 -6
  11. mcp_server_taxcode-1.2.0/docker/uv-bootstrap.txt +26 -0
  12. mcp_server_taxcode-1.2.0/docs/ga/llms-full.txt +64 -0
  13. mcp_server_taxcode-1.2.0/docs/ga/ocga_48_7_20.md +17 -0
  14. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ga/ocga_48_7_20_2024.md +3 -3
  15. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ga/ocga_48_7_20_2025.md +3 -3
  16. mcp_server_taxcode-1.2.0/docs/ga/ocga_48_7_27.md +17 -0
  17. mcp_server_taxcode-1.2.0/docs/id/idaho code_63_3024.md +17 -0
  18. mcp_server_taxcode-1.2.0/docs/id/llms-full.txt +10 -0
  19. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/llms-full.txt +2 -2
  20. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/llms.txt +25 -5
  21. mcp_server_taxcode-1.2.0/docs/ms/llms-full.txt +10 -0
  22. mcp_server_taxcode-1.2.0/docs/ms/miss. code_27_7_5.md +17 -0
  23. mcp_server_taxcode-1.2.0/docs/ne/llms-full.txt +10 -0
  24. mcp_server_taxcode-1.2.0/docs/ne/neb. rev. stat._77_2715_03.md +17 -0
  25. mcp_server_taxcode-1.2.0/docs/oh/llms-full.txt +19 -0
  26. mcp_server_taxcode-1.2.0/docs/oh/r.c._5747_02.md +17 -0
  27. mcp_server_taxcode-1.2.0/docs/pr/cri_1031_02_2019.md +25 -0
  28. mcp_server_taxcode-1.2.0/docs/pr/cri_1062_01_2019.md +25 -0
  29. mcp_server_taxcode-1.2.0/docs/pr/cri_1062_03_2019.md +27 -0
  30. mcp_server_taxcode-1.2.0/docs/pr/ley60_1020_02_2019.md +48 -0
  31. mcp_server_taxcode-1.2.0/docs/pr/ley60_1020_02_2020.md +25 -0
  32. mcp_server_taxcode-1.2.0/docs/pr/ley60_2022_02_2019.md +20 -0
  33. mcp_server_taxcode-1.2.0/docs/pr/ley60_6020_03_2019.md +22 -0
  34. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_6020_10.md +4 -3
  35. mcp_server_taxcode-1.2.0/docs/pr/ley60_6020_10_2019.md +40 -0
  36. mcp_server_taxcode-1.2.0/docs/pr/ley60_6020_10_2020.md +32 -0
  37. mcp_server_taxcode-1.2.0/docs/pr/ley60_6020_10_2022.md +32 -0
  38. 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
  39. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_6020_10_2025.md +5 -4
  40. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/llms-full.txt +232 -12
  41. mcp_server_taxcode-1.2.0/docs/us/cfr_1_937_3_2019.md +39 -0
  42. mcp_server_taxcode-1.2.0/docs/us/irc_1_2019.md +22 -0
  43. mcp_server_taxcode-1.2.0/docs/us/irc_1_2020.md +403 -0
  44. mcp_server_taxcode-1.2.0/docs/us/irc_24_2019.md +101 -0
  45. mcp_server_taxcode-1.2.0/docs/us/irc_24_2021.md +186 -0
  46. mcp_server_taxcode-1.2.0/docs/us/irc_32_2019.md +151 -0
  47. mcp_server_taxcode-1.2.0/docs/us/irc_62_2019.md +136 -0
  48. mcp_server_taxcode-1.2.0/docs/us/irc_62_2020.md +23 -0
  49. mcp_server_taxcode-1.2.0/docs/us/irc_62_2021.md +135 -0
  50. mcp_server_taxcode-1.2.0/docs/us/irc_63_2019.md +100 -0
  51. mcp_server_taxcode-1.2.0/docs/us/irc_63_2021.md +100 -0
  52. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/llms-full.txt +1431 -123
  53. mcp_server_taxcode-1.2.0/docs/ut/llms-full.txt +10 -0
  54. mcp_server_taxcode-1.2.0/docs/ut/utah code_59_10_104.md +17 -0
  55. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/wa/llms-full.txt +2 -2
  56. mcp_server_taxcode-1.2.0/docs/wa/rcw_82_87_040.md +17 -0
  57. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/pyproject.toml +3 -4
  58. mcp_server_taxcode-1.2.0/scripts/build_corrected_pins.py +73 -0
  59. mcp_server_taxcode-1.2.0/scripts/build_prior_years_pins.py +255 -0
  60. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/scripts/check_tool_contract.py +35 -8
  61. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/scripts/setup_repo_governance.sh +2 -3
  62. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/catalog.py +381 -22
  63. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/client.py +23 -4
  64. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/federal/standard_deduction.json +48 -0
  65. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/al.json +4 -4
  66. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/ar.json +4 -4
  67. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/az.json +4 -4
  68. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/co.json +97 -0
  69. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/dc.json +4 -4
  70. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/de.json +4 -4
  71. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/ga.json +49 -25
  72. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/hi.json +4 -4
  73. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/ia.json +4 -4
  74. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/id.json +83 -0
  75. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/il.json +4 -4
  76. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/in.json +4 -4
  77. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/ks.json +4 -4
  78. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ky.json +77 -0
  79. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/la.json +4 -4
  80. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ma.json +100 -0
  81. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/me.json +3 -3
  82. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/mi.json +3 -3
  83. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/mn.json +4 -4
  84. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/mo.json +4 -4
  85. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ms.json +164 -0
  86. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/mt.json +4 -4
  87. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/nc.json +4 -4
  88. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/nd.json +4 -4
  89. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ne.json +138 -0
  90. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/nm.json +4 -4
  91. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/oh.json +102 -0
  92. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/ok.json +4 -4
  93. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/or.json +4 -4
  94. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/pa.json +4 -4
  95. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/pr.json +136 -6
  96. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ri.json +75 -0
  97. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/sc.json +4 -4
  98. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/us.json +246 -0
  99. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/ut.json +88 -0
  100. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/va.json +4 -4
  101. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/vt.json +3 -3
  102. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/manifest/wa.json +102 -0
  103. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/wi.json +4 -4
  104. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/wv.json +4 -4
  105. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/publications/ga.json +15 -0
  106. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/al.json +44 -0
  107. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/ar.json +6 -5
  108. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/az.json +1 -1
  109. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/co.json +46 -0
  110. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/dc.json +76 -0
  111. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/de.json +76 -0
  112. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ga.json +53 -0
  113. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/hi.json +118 -0
  114. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ia.json +46 -0
  115. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/id.json +62 -0
  116. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/il.json +1 -1
  117. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/in.json +1 -1
  118. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ks.json +36 -0
  119. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ky.json +20 -0
  120. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/la.json +31 -4
  121. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ma.json +29 -0
  122. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/me.json +44 -0
  123. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/mi.json +1 -1
  124. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/mn.json +52 -0
  125. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/mo.json +84 -0
  126. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ms.json +174 -0
  127. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/mt.json +36 -0
  128. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/nc.json +2 -2
  129. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/nd.json +1 -1
  130. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ne.json +214 -0
  131. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/nm.json +63 -0
  132. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/oh.json +110 -0
  133. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ok.json +68 -0
  134. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/or.json +53 -0
  135. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/pa.json +9 -0
  136. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ri.json +108 -0
  137. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/sc.json +44 -0
  138. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/ut.json +27 -0
  139. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/va.json +1 -1
  140. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/vt.json +52 -0
  141. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/wa.json +16 -0
  142. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/wi.json +52 -0
  143. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/rates/wv.json +60 -0
  144. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ga.json +11 -11
  145. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/id.json +2 -2
  146. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ms.json +2 -2
  147. mcp_server_taxcode-1.2.0/src/taxcode_mcp/data/statutes/ne.json +26 -0
  148. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/oh.json +2 -2
  149. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/pr.json +374 -17
  150. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/us.json +1845 -382
  151. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ut.json +2 -2
  152. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/wa.json +2 -2
  153. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/db.py +103 -6
  154. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/disclaimers.py +20 -3
  155. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/tools/compliance.py +343 -59
  156. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/tools/statutes.py +11 -1
  157. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/tools/system.py +1 -1
  158. mcp_server_taxcode-1.2.0/tests/fixtures/compliance_golden/compliance_evaluate_georgia_residency.jsonl.gz +0 -0
  159. mcp_server_taxcode-1.2.0/tests/fixtures/compliance_golden/compliance_evaluate_state_residency.jsonl.gz +0 -0
  160. mcp_server_taxcode-1.2.0/tests/fixtures/prior_years/corrected_answers.json +258 -0
  161. mcp_server_taxcode-1.2.0/tests/fixtures/prior_years/f4f0d5d_pins.json.gz +0 -0
  162. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_batch.py +34 -0
  163. mcp_server_taxcode-1.2.0/tests/test_catalog.py +822 -0
  164. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_client.py +123 -0
  165. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_code_mode_extra.py +1 -5
  166. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_db.py +66 -19
  167. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_dockerfile.py +71 -2
  168. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_ingest.py +109 -9
  169. mcp_server_taxcode-1.2.0/tests/test_notfound_pointer.py +205 -0
  170. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_paging.py +10 -3
  171. mcp_server_taxcode-1.2.0/tests/test_prior_years.py +607 -0
  172. mcp_server_taxcode-1.2.0/tests/test_prior_years_pin.py +335 -0
  173. mcp_server_taxcode-1.2.0/tests/test_prior_years_pr.py +616 -0
  174. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_protocol.py +13 -0
  175. mcp_server_taxcode-1.2.0/tests/test_rate_prose.py +83 -0
  176. mcp_server_taxcode-1.2.0/tests/test_rate_tables.py +1232 -0
  177. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_search_normalize.py +8 -1
  178. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_server.py +28 -26
  179. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/uv.lock +71 -553
  180. mcp_server_taxcode-1.0.0/.github/dependabot.yml +0 -36
  181. mcp_server_taxcode-1.0.0/.github/workflows/drift-monitor.yml +0 -47
  182. mcp_server_taxcode-1.0.0/docs/ga/llms-full.txt +0 -64
  183. mcp_server_taxcode-1.0.0/docs/ga/ocga_48_7_20.md +0 -17
  184. mcp_server_taxcode-1.0.0/docs/ga/ocga_48_7_27.md +0 -17
  185. mcp_server_taxcode-1.0.0/docs/id/idaho code_63_3024.md +0 -17
  186. mcp_server_taxcode-1.0.0/docs/id/llms-full.txt +0 -10
  187. mcp_server_taxcode-1.0.0/docs/ms/llms-full.txt +0 -10
  188. mcp_server_taxcode-1.0.0/docs/ms/miss. code_27_7_5.md +0 -17
  189. mcp_server_taxcode-1.0.0/docs/ne/llms-full.txt +0 -10
  190. mcp_server_taxcode-1.0.0/docs/ne/neb. rev. stat._77_2715_03.md +0 -17
  191. mcp_server_taxcode-1.0.0/docs/oh/llms-full.txt +0 -19
  192. mcp_server_taxcode-1.0.0/docs/oh/r.c._5747_02.md +0 -17
  193. mcp_server_taxcode-1.0.0/docs/ut/llms-full.txt +0 -10
  194. mcp_server_taxcode-1.0.0/docs/ut/utah code_59_10_104.md +0 -17
  195. mcp_server_taxcode-1.0.0/docs/wa/rcw_82_87_040.md +0 -17
  196. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/co.json +0 -45
  197. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/id.json +0 -32
  198. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ky.json +0 -32
  199. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ma.json +0 -58
  200. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ms.json +0 -32
  201. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ne.json +0 -32
  202. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/oh.json +0 -58
  203. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ri.json +0 -32
  204. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ut.json +0 -32
  205. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/wa.json +0 -58
  206. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/publications/ga.json +0 -24
  207. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/al.json +0 -17
  208. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/co.json +0 -13
  209. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/dc.json +0 -17
  210. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/de.json +0 -17
  211. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ga.json +0 -36
  212. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/hi.json +0 -19
  213. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ia.json +0 -19
  214. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/id.json +0 -16
  215. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ks.json +0 -15
  216. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ky.json +0 -15
  217. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ma.json +0 -17
  218. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/me.json +0 -17
  219. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/mn.json +0 -17
  220. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/mo.json +0 -17
  221. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ms.json +0 -15
  222. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/mt.json +0 -17
  223. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ne.json +0 -17
  224. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/nm.json +0 -20
  225. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/oh.json +0 -48
  226. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ok.json +0 -17
  227. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/or.json +0 -18
  228. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/pa.json +0 -9
  229. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ri.json +0 -17
  230. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/sc.json +0 -17
  231. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ut.json +0 -15
  232. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/vt.json +0 -17
  233. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/wa.json +0 -10
  234. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/wi.json +0 -17
  235. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/wv.json +0 -17
  236. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/ne.json +0 -26
  237. mcp_server_taxcode-1.0.0/tests/fixtures/compliance_golden/compliance_evaluate_georgia_residency.jsonl.gz +0 -0
  238. mcp_server_taxcode-1.0.0/tests/fixtures/compliance_golden/compliance_evaluate_state_residency.jsonl.gz +0 -0
  239. mcp_server_taxcode-1.0.0/tests/test_catalog.py +0 -461
  240. mcp_server_taxcode-1.0.0/tests/test_rate_tables.py +0 -192
  241. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/.github/workflows/dependabot-automerge.yml +0 -0
  242. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/.gitignore +0 -0
  243. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/CHANGELOG.md +0 -0
  244. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/CODE_OF_CONDUCT.md +0 -0
  245. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/LICENSE +0 -0
  246. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/SECURITY.md +0 -0
  247. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docker/pip-bootstrap.txt +0 -0
  248. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ak/alaska stat._43_05_080.md +0 -0
  249. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ak/llms-full.txt +0 -0
  250. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/al/ala. code_40_18_2.md +0 -0
  251. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/al/llms-full.txt +0 -0
  252. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ar/a.c.a._26_51_201.md +0 -0
  253. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ar/llms-full.txt +0 -0
  254. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/az/a.r.s._43_1011.md +0 -0
  255. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/az/a.r.s._43_104.md +0 -0
  256. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/az/llms-full.txt +0 -0
  257. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ca/caccr_17014.md +0 -0
  258. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ca/llms-full.txt +0 -0
  259. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ca/rtc_17014.md +0 -0
  260. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ca/rtc_17041.md +0 -0
  261. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ca/rtc_17951.md +0 -0
  262. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/co/c.r.s._39_22_103.md +0 -0
  263. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/co/c.r.s._39_22_104.md +0 -0
  264. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/co/llms-full.txt +0 -0
  265. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ct/c.g.s._12_700.md +0 -0
  266. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ct/c.g.s._12_701.md +0 -0
  267. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ct/c.g.s._12_711.md +0 -0
  268. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ct/llms-full.txt +0 -0
  269. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/dc/d.c. code_47_1806_03.md +0 -0
  270. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/dc/llms-full.txt +0 -0
  271. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/de/del. code_1102.md +0 -0
  272. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/de/llms-full.txt +0 -0
  273. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/fl/flconst_art__vii_sec__5.md +0 -0
  274. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/fl/flstat_196_031.md +0 -0
  275. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/fl/flstat_222_17.md +0 -0
  276. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/fl/llms-full.txt +0 -0
  277. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ga/gareg_560_7_3__01.md +0 -0
  278. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ga/ocga_48_7_1.md +0 -0
  279. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ga/ocga_48_7_30.md +0 -0
  280. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/hi/hrs_235_51.md +0 -0
  281. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/hi/llms-full.txt +0 -0
  282. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ia/iowa code_422_5.md +0 -0
  283. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ia/llms-full.txt +0 -0
  284. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/il/ilcs_5_1501_a_20.md +0 -0
  285. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/il/ilcs_5_201.md +0 -0
  286. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/il/ilcs_5_301.md +0 -0
  287. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/il/llms-full.txt +0 -0
  288. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/in/ind. code_6_3_2_1.md +0 -0
  289. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/in/llms-full.txt +0 -0
  290. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ks/k.s.a._79_32,110.md +0 -0
  291. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ks/llms-full.txt +0 -0
  292. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ky/krs_141_020.md +0 -0
  293. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ky/llms-full.txt +0 -0
  294. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/la/la. r.s._47_32.md +0 -0
  295. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/la/la. r.s._47_32_2022.md +0 -0
  296. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/la/llms-full.txt +0 -0
  297. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ma/llms-full.txt +0 -0
  298. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ma/maconst_art__xliv.md +0 -0
  299. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ma/mgl_62_1_f.md +0 -0
  300. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ma/mgl_62_4.md +0 -0
  301. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/md/llms-full.txt +0 -0
  302. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/md/md. code_10_101.md +0 -0
  303. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/md/md. code_10_105.md +0 -0
  304. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/md/md. code_10_106.md +0 -0
  305. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/me/36 m.r.s._5111.md +0 -0
  306. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/me/llms-full.txt +0 -0
  307. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/mi/llms-full.txt +0 -0
  308. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/mi/mcl_206_51.md +0 -0
  309. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/mn/llms-full.txt +0 -0
  310. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/mn/minn. stat._290_06.md +0 -0
  311. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/mo/llms-full.txt +0 -0
  312. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/mo/rsmo_143_011.md +0 -0
  313. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/mt/llms-full.txt +0 -0
  314. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/mt/mca_15_30_2103.md +0 -0
  315. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nc/llms-full.txt +0 -0
  316. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nc/n.c.g.s._105_153_3.md +0 -0
  317. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nc/n.c.g.s._105_153_7.md +0 -0
  318. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nd/llms-full.txt +0 -0
  319. {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
  320. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nh/llms-full.txt +0 -0
  321. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nh/rsa_77_1_2024.md +0 -0
  322. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nj/llms-full.txt +0 -0
  323. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nj/njac_18_35_5_2.md +0 -0
  324. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nj/njsa_54a_1_2.md +0 -0
  325. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nj/njsa_54a_2_1.md +0 -0
  326. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nm/llms-full.txt +0 -0
  327. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nm/nmsa_7_2_7.md +0 -0
  328. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nv/llms-full.txt +0 -0
  329. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/nv/nev. const._art__10,_/302/247_1.md" +0 -0
  330. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ny/llms-full.txt +0 -0
  331. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ny/nycrr_105_20.md +0 -0
  332. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ny/nycrr_132_18.md +0 -0
  333. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ny/nytax_601.md +0 -0
  334. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ny/nytax_605.md +0 -0
  335. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/oh/r.c._5747_24.md +0 -0
  336. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ok/68 o.s._2355.md +0 -0
  337. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ok/llms-full.txt +0 -0
  338. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/or/llms-full.txt +0 -0
  339. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/or/ors_316_037.md +0 -0
  340. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pa/llms-full.txt +0 -0
  341. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pa/p.s._7301.md +0 -0
  342. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pa/p.s._7302.md +0 -0
  343. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pa/pa. code_109_8.md +0 -0
  344. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/cri_1010_01.md +0 -0
  345. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/cri_1031_01.md +0 -0
  346. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/cri_1031_02.md +0 -0
  347. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/cri_1062_01.md +0 -0
  348. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/cri_1062_03.md +0 -0
  349. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley22_3_2012.md +0 -0
  350. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_1020_02.md +0 -0
  351. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_2021_01.md +0 -0
  352. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_2022_01.md +0 -0
  353. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_2022_01_2019.md +0 -0
  354. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_2022_02.md +0 -0
  355. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_2031_01.md +0 -0
  356. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_2032_01.md +0 -0
  357. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_6020_03.md +0 -0
  358. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/pr/ley60_6070_55.md +0 -0
  359. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ri/llms-full.txt +0 -0
  360. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/ri/r.i.g.l._44_30_1.md +0 -0
  361. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/sc/llms-full.txt +0 -0
  362. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/sc/s.c. code_12_6_510.md +0 -0
  363. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/sd/llms-full.txt +0 -0
  364. {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
  365. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/tn/llms-full.txt +0 -0
  366. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/tn/tenn. const._art__ii,_/302/247_28.md" +0 -0
  367. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/tx/llms-full.txt +0 -0
  368. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/tx/txconst_art__viii_sec__24_a.md +0 -0
  369. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/tx/txtax_171_001.md +0 -0
  370. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/cfr_1_937_1.md +0 -0
  371. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/cfr_1_937_2.md +0 -0
  372. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/cfr_1_937_3.md +0 -0
  373. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_1.md +0 -0
  374. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_1411.md +0 -0
  375. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_24.md +0 -0
  376. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_32.md +0 -0
  377. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_6012.md +0 -0
  378. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_61.md +0 -0
  379. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_62.md +0 -0
  380. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_63.md +0 -0
  381. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_6688.md +0 -0
  382. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_865.md +0 -0
  383. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_911.md +0 -0
  384. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_933.md +0 -0
  385. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_937.md +0 -0
  386. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/us/irc_957.md +0 -0
  387. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/va/llms-full.txt +0 -0
  388. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/va/va. code_58_1_302.md +0 -0
  389. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/va/va. code_58_1_320.md +0 -0
  390. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/va/va. code_58_1_342.md +0 -0
  391. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/vt/32 v.s.a._5822.md +0 -0
  392. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/vt/llms-full.txt +0 -0
  393. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/wa/rcw_82_87_020.md +0 -0
  394. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/wa/waconst_art__vii_sec__1.md +0 -0
  395. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/wi/llms-full.txt +0 -0
  396. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/wi/wis. stat._71_06.md +0 -0
  397. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/wv/llms-full.txt +0 -0
  398. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/wv/w. va. code_11_21_4e.md +0 -0
  399. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/wy/llms-full.txt +0 -0
  400. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/docs/wy/wyo. const._art__15,_/302/247_18.md" +0 -0
  401. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/fastmcp.json +0 -0
  402. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/scripts/build_catalog.py +0 -0
  403. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/scripts/check_conformance.sh +0 -0
  404. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/scripts/check_openapi_drift.py +0 -0
  405. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/scripts/check_version.py +0 -0
  406. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/scripts/ingest_statutes.py +0 -0
  407. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/scripts/release_notes.py +0 -0
  408. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/server.json +0 -0
  409. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/skills/taxcode-mcp/SKILL.md +0 -0
  410. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/__init__.py +0 -0
  411. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/auth.py +0 -0
  412. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/config.py +0 -0
  413. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/jurisdictions.json +0 -0
  414. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/ak.json +0 -0
  415. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/ca.json +0 -0
  416. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/ct.json +0 -0
  417. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/fl.json +0 -0
  418. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/md.json +0 -0
  419. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/nh.json +0 -0
  420. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/nj.json +0 -0
  421. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/nv.json +0 -0
  422. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/ny.json +0 -0
  423. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/sd.json +0 -0
  424. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/tn.json +0 -0
  425. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/tx.json +0 -0
  426. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/manifest/wy.json +0 -0
  427. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/publications/md.json +0 -0
  428. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/publications/oh.json +0 -0
  429. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/publications/pa.json +0 -0
  430. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/publications/pr.json +0 -0
  431. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/publications/us.json +0 -0
  432. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/publications/va.json +0 -0
  433. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/ak.json +0 -0
  434. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/ca.json +0 -0
  435. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/ct.json +0 -0
  436. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/md.json +0 -0
  437. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/nh.json +0 -0
  438. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/nj.json +0 -0
  439. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/nv.json +0 -0
  440. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/ny.json +0 -0
  441. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/sd.json +0 -0
  442. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/tn.json +0 -0
  443. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/rates/wy.json +0 -0
  444. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ak.json +0 -0
  445. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/al.json +0 -0
  446. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ar.json +0 -0
  447. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/az.json +0 -0
  448. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ca.json +0 -0
  449. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/co.json +0 -0
  450. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ct.json +0 -0
  451. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/dc.json +0 -0
  452. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/de.json +0 -0
  453. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/fl.json +0 -0
  454. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/hi.json +0 -0
  455. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ia.json +0 -0
  456. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/il.json +0 -0
  457. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/in.json +0 -0
  458. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ks.json +0 -0
  459. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ky.json +0 -0
  460. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/la.json +0 -0
  461. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ma.json +0 -0
  462. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/md.json +0 -0
  463. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/me.json +0 -0
  464. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/mi.json +0 -0
  465. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/mn.json +0 -0
  466. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/mo.json +0 -0
  467. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/mt.json +0 -0
  468. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/nc.json +0 -0
  469. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/nd.json +0 -0
  470. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/nh.json +0 -0
  471. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/nj.json +0 -0
  472. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/nm.json +0 -0
  473. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/nv.json +0 -0
  474. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ny.json +0 -0
  475. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ok.json +0 -0
  476. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/or.json +0 -0
  477. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/pa.json +0 -0
  478. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/ri.json +0 -0
  479. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/sc.json +0 -0
  480. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/sd.json +0 -0
  481. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/tn.json +0 -0
  482. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/tx.json +0 -0
  483. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/va.json +0 -0
  484. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/vt.json +0 -0
  485. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/wi.json +0 -0
  486. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/wv.json +0 -0
  487. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/data/statutes/wy.json +0 -0
  488. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/errors.py +0 -0
  489. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/middleware.py +0 -0
  490. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/paging.py +0 -0
  491. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/profiles.py +0 -0
  492. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/server.py +0 -0
  493. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/ssrf.py +0 -0
  494. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/src/taxcode_mcp/tools/__init__.py +0 -0
  495. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/conftest.py +0 -0
  496. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/fake_network.py +0 -0
  497. {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
  498. {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
  499. {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
  500. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/fixtures/compliance_golden/constants.json +0 -0
  501. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/fixtures/usc26_sample.xml +0 -0
  502. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/golden_compliance.py +0 -0
  503. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_check_version.py +0 -0
  504. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_compliance_golden.py +0 -0
  505. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_config.py +0 -0
  506. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_conftest_auth_env.py +0 -0
  507. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_disclaimers.py +0 -0
  508. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_drift.py +0 -0
  509. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_e2e_live.py +0 -0
  510. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_errors.py +0 -0
  511. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_federal.py +0 -0
  512. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_http_auth.py +0 -0
  513. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_layered.py +0 -0
  514. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_network_guard.py +0 -0
  515. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_otel_spans.py +0 -0
  516. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_profiles.py +0 -0
  517. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_release_notes.py +0 -0
  518. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_search_snippets.py +0 -0
  519. {mcp_server_taxcode-1.0.0 → mcp_server_taxcode-1.2.0}/tests/test_ssrf.py +0 -0
  520. {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 daily run tests main itself; schedule runs only on the
11
- # default branch. The minute is off the hour to avoid peak scheduler load.
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: '29 9 * * *'
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@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
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@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
51
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
47
52
  with:
48
- python-version: "3.10"
53
+ python-version: "3.11"
49
54
 
50
55
  - name: Install dependencies
51
- run: uv sync --locked --extra dev --python 3.10
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.10", "3.11", "3.12", "3.13", "3.14"]
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@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
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@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
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@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
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@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
121
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
117
122
  with:
118
- python-version: "3.10"
123
+ python-version: "3.11"
119
124
 
120
125
  - name: Install dependencies
121
- run: uv sync --locked --extra dev --python 3.10
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@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
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@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
164
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
160
165
  with:
161
- python-version: "3.10"
166
+ python-version: "3.11"
162
167
 
163
168
  - name: Install dependencies
164
- run: uv sync --locked --extra dev --python 3.10
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@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
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@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
37
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
38
38
  with:
39
- python-version: "3.10"
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@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
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@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
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`, `drift-monitor.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`.
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.10–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)). It runs on pushes and pull requests to `main`, daily on `main` at 09:29 UTC (`schedule`), and on manual dispatch (`workflow_dispatch`); the daily 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. Scheduled upstream drift runs in `drift-monitor.yml`. `dependabot-automerge.yml` turns on squash auto-merge only for Dependabot PRs whose highest update is minor or patch; major updates wait for a human review. Docker base image updates (`package-ecosystem` `docker`) never auto-merge and always wait for a human review: Dependabot's docker ecosystem can move the image tag, not just its digest (for example `python:3.12-slim` to `python:3.14-slim`, a Python runtime upgrade that Dependabot labels a minor update), so the job logs a notice and leaves the PR open.
214
+ CI is defined in `.github/workflows/ci.yml` (jobs: `lint-and-types`, `test` on Python 3.11–3.14, `tool-contract`, `build-check`, `docker-build` (builds the image without pushing, checks its MCP server-name label against `server.json`, 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 table has a `source_url` and a `rate_table` entry in `manifest/<code>.json` with the same `url`. No table cites a source yet, so both are `"not_recorded"`. Record a source only once it has been checked.
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 /tmp/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 builds with pip, not uv, so pip carries the floor.
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.0.0
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.10
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>(117 Statutes, 18 Publications, Full-Text Search, Temporal Versions)"]
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>(117 Statutes, 18 Publications, Full-Text Search, Temporal Versions)"]
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
- # These scenarios represent either:
5
- # 1. Deprecated protocol features removed per SEP-2577 / Protocol 2026-07-28
6
- # (in-protocol logging/setLevel, server-initiated sampling)
7
- # 2. Synthetic test fixtures defined by the conformance suite specification
8
- # (e.g. test_audio_content, test://static-text, test_simple_prompt)
9
- # which are not part of this production server domain schema.
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.49%)
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.49% on Georgia taxable net income for tax year 2024 pursuant to HB 1023, eliminating previous graduated brackets.
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.49% sobre el ingreso neto tributable de individuos para el año contributivo 2024 bajo HB 1023.
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.39%)
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.39% for tax year 2025 pursuant to HB 1015.
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.39% para el año contributivo 2025 bajo HB 1015.
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.