mcp-server-taxcode 0.7.2__tar.gz → 1.0.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 (438) hide show
  1. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/.github/workflows/ci.yml +48 -9
  2. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/.github/workflows/dependabot-automerge.yml +15 -1
  3. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/.github/workflows/drift-monitor.yml +4 -2
  4. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/.github/workflows/release.yml +3 -1
  5. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/AGENTS.md +14 -3
  6. mcp_server_taxcode-1.0.0/CONTRIBUTING.md +59 -0
  7. mcp_server_taxcode-1.0.0/Dockerfile +83 -0
  8. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/PKG-INFO +10 -5
  9. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/README.md +4 -1
  10. mcp_server_taxcode-1.0.0/SECURITY.md +18 -0
  11. mcp_server_taxcode-1.0.0/docker/pip-bootstrap.txt +5 -0
  12. mcp_server_taxcode-1.0.0/docs/ak/llms-full.txt +10 -0
  13. mcp_server_taxcode-1.0.0/docs/al/llms-full.txt +10 -0
  14. mcp_server_taxcode-1.0.0/docs/ar/llms-full.txt +10 -0
  15. mcp_server_taxcode-1.0.0/docs/az/llms-full.txt +19 -0
  16. mcp_server_taxcode-1.0.0/docs/ca/llms-full.txt +37 -0
  17. mcp_server_taxcode-1.0.0/docs/co/llms-full.txt +19 -0
  18. mcp_server_taxcode-1.0.0/docs/ct/llms-full.txt +28 -0
  19. mcp_server_taxcode-1.0.0/docs/dc/llms-full.txt +10 -0
  20. mcp_server_taxcode-1.0.0/docs/de/llms-full.txt +10 -0
  21. mcp_server_taxcode-1.0.0/docs/fl/llms-full.txt +28 -0
  22. mcp_server_taxcode-1.0.0/docs/ga/llms-full.txt +64 -0
  23. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ga/ocga_48_7_20.md +1 -1
  24. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ga/ocga_48_7_20_2024.md +1 -1
  25. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ga/ocga_48_7_20_2025.md +1 -1
  26. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ga/ocga_48_7_27.md +1 -1
  27. mcp_server_taxcode-1.0.0/docs/hi/llms-full.txt +10 -0
  28. mcp_server_taxcode-1.0.0/docs/ia/llms-full.txt +10 -0
  29. mcp_server_taxcode-1.0.0/docs/id/llms-full.txt +10 -0
  30. mcp_server_taxcode-1.0.0/docs/il/llms-full.txt +28 -0
  31. mcp_server_taxcode-1.0.0/docs/in/llms-full.txt +10 -0
  32. mcp_server_taxcode-1.0.0/docs/ks/llms-full.txt +10 -0
  33. mcp_server_taxcode-1.0.0/docs/ky/llms-full.txt +10 -0
  34. mcp_server_taxcode-1.0.0/docs/la/llms-full.txt +19 -0
  35. mcp_server_taxcode-1.0.0/docs/llms-full.txt +57 -0
  36. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/llms.txt +35 -6
  37. mcp_server_taxcode-1.0.0/docs/ma/llms-full.txt +28 -0
  38. mcp_server_taxcode-1.0.0/docs/md/llms-full.txt +28 -0
  39. mcp_server_taxcode-1.0.0/docs/me/llms-full.txt +10 -0
  40. mcp_server_taxcode-1.0.0/docs/mi/llms-full.txt +10 -0
  41. mcp_server_taxcode-1.0.0/docs/mn/llms-full.txt +10 -0
  42. mcp_server_taxcode-1.0.0/docs/mo/llms-full.txt +10 -0
  43. mcp_server_taxcode-1.0.0/docs/ms/llms-full.txt +10 -0
  44. mcp_server_taxcode-1.0.0/docs/mt/llms-full.txt +10 -0
  45. mcp_server_taxcode-1.0.0/docs/nc/llms-full.txt +19 -0
  46. mcp_server_taxcode-1.0.0/docs/nd/llms-full.txt +10 -0
  47. mcp_server_taxcode-1.0.0/docs/ne/llms-full.txt +10 -0
  48. mcp_server_taxcode-1.0.0/docs/nh/llms-full.txt +10 -0
  49. mcp_server_taxcode-1.0.0/docs/nj/llms-full.txt +28 -0
  50. mcp_server_taxcode-1.0.0/docs/nm/llms-full.txt +10 -0
  51. mcp_server_taxcode-1.0.0/docs/nv/llms-full.txt +10 -0
  52. mcp_server_taxcode-1.0.0/docs/ny/llms-full.txt +37 -0
  53. mcp_server_taxcode-1.0.0/docs/oh/llms-full.txt +19 -0
  54. mcp_server_taxcode-1.0.0/docs/ok/llms-full.txt +10 -0
  55. mcp_server_taxcode-1.0.0/docs/or/llms-full.txt +10 -0
  56. mcp_server_taxcode-1.0.0/docs/pa/llms-full.txt +28 -0
  57. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/pr/ley22_3_2012.md +1 -1
  58. mcp_server_taxcode-1.0.0/docs/pr/ley60_1020_02.md +33 -0
  59. mcp_server_taxcode-1.0.0/docs/pr/ley60_2021_01.md +17 -0
  60. mcp_server_taxcode-1.0.0/docs/pr/ley60_2022_01.md +22 -0
  61. mcp_server_taxcode-1.0.0/docs/pr/ley60_2022_01_2019.md +17 -0
  62. mcp_server_taxcode-1.0.0/docs/pr/ley60_2022_02.md +21 -0
  63. mcp_server_taxcode-1.0.0/docs/pr/ley60_6020_03.md +21 -0
  64. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/pr/ley60_6020_10.md +3 -2
  65. mcp_server_taxcode-1.0.0/docs/pr/ley60_6020_10_2019.md +30 -0
  66. mcp_server_taxcode-1.0.0/docs/pr/ley60_6020_10_2025.md +31 -0
  67. mcp_server_taxcode-1.0.0/docs/pr/llms-full.txt +538 -0
  68. mcp_server_taxcode-1.0.0/docs/ri/llms-full.txt +10 -0
  69. mcp_server_taxcode-1.0.0/docs/sc/llms-full.txt +10 -0
  70. mcp_server_taxcode-1.0.0/docs/sd/llms-full.txt +10 -0
  71. mcp_server_taxcode-1.0.0/docs/tn/llms-full.txt +10 -0
  72. mcp_server_taxcode-1.0.0/docs/tx/llms-full.txt +19 -0
  73. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/us/cfr_1_937_1.md +1 -1
  74. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/us/cfr_1_937_2.md +1 -1
  75. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/us/cfr_1_937_3.md +1 -1
  76. mcp_server_taxcode-1.0.0/docs/us/llms-full.txt +1501 -0
  77. mcp_server_taxcode-1.0.0/docs/ut/llms-full.txt +10 -0
  78. mcp_server_taxcode-1.0.0/docs/va/llms-full.txt +28 -0
  79. mcp_server_taxcode-1.0.0/docs/vt/llms-full.txt +10 -0
  80. mcp_server_taxcode-1.0.0/docs/wa/llms-full.txt +28 -0
  81. mcp_server_taxcode-1.0.0/docs/wi/llms-full.txt +10 -0
  82. mcp_server_taxcode-1.0.0/docs/wv/llms-full.txt +10 -0
  83. mcp_server_taxcode-1.0.0/docs/wy/llms-full.txt +10 -0
  84. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/fastmcp.json +2 -1
  85. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/pyproject.toml +12 -3
  86. mcp_server_taxcode-1.0.0/scripts/build_catalog.py +147 -0
  87. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/scripts/check_openapi_drift.py +33 -4
  88. mcp_server_taxcode-1.0.0/scripts/ingest_statutes.py +510 -0
  89. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/scripts/setup_repo_governance.sh +1 -0
  90. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/skills/taxcode-mcp/SKILL.md +3 -1
  91. mcp_server_taxcode-1.0.0/src/taxcode_mcp/catalog.py +710 -0
  92. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/src/taxcode_mcp/client.py +126 -14
  93. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/jurisdictions.json +55 -0
  94. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ak.json +32 -0
  95. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/al.json +32 -0
  96. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ar.json +32 -0
  97. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/az.json +45 -0
  98. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ca.json +71 -0
  99. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/co.json +45 -0
  100. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ct.json +58 -0
  101. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/dc.json +32 -0
  102. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/de.json +32 -0
  103. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/fl.json +45 -0
  104. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ga.json +136 -0
  105. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/hi.json +32 -0
  106. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ia.json +32 -0
  107. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/id.json +32 -0
  108. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/il.json +58 -0
  109. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/in.json +32 -0
  110. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ks.json +32 -0
  111. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ky.json +32 -0
  112. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/la.json +45 -0
  113. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ma.json +58 -0
  114. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/md.json +71 -0
  115. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/me.json +32 -0
  116. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/mi.json +32 -0
  117. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/mn.json +32 -0
  118. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/mo.json +32 -0
  119. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ms.json +32 -0
  120. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/mt.json +32 -0
  121. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/nc.json +45 -0
  122. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/nd.json +32 -0
  123. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ne.json +32 -0
  124. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/nh.json +32 -0
  125. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/nj.json +58 -0
  126. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/nm.json +32 -0
  127. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/nv.json +32 -0
  128. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ny.json +71 -0
  129. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/oh.json +58 -0
  130. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ok.json +32 -0
  131. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/or.json +32 -0
  132. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/pa.json +71 -0
  133. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/pr.json +578 -0
  134. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ri.json +32 -0
  135. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/sc.json +32 -0
  136. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/sd.json +32 -0
  137. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/tn.json +32 -0
  138. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/tx.json +32 -0
  139. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/us.json +305 -0
  140. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/ut.json +32 -0
  141. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/va.json +71 -0
  142. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/vt.json +32 -0
  143. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/wa.json +58 -0
  144. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/wi.json +32 -0
  145. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/wv.json +32 -0
  146. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/manifest/wy.json +32 -0
  147. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/publications/ga.json +24 -0
  148. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/publications/md.json +15 -0
  149. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/publications/oh.json +15 -0
  150. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/publications/pa.json +15 -0
  151. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/publications/pr.json +240 -0
  152. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/publications/us.json +60 -0
  153. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/publications/va.json +15 -0
  154. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ak.json +12 -0
  155. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/al.json +17 -0
  156. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ar.json +17 -0
  157. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/az.json +13 -0
  158. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ca.json +50 -0
  159. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/co.json +13 -0
  160. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ct.json +50 -0
  161. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/dc.json +17 -0
  162. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/de.json +17 -0
  163. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ga.json +36 -0
  164. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/hi.json +19 -0
  165. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ia.json +19 -0
  166. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/id.json +16 -0
  167. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/il.json +13 -0
  168. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/in.json +18 -0
  169. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ks.json +15 -0
  170. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ky.json +15 -0
  171. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/la.json +23 -0
  172. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ma.json +17 -0
  173. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/md.json +49 -0
  174. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/me.json +17 -0
  175. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/mi.json +15 -0
  176. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/mn.json +17 -0
  177. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/mo.json +17 -0
  178. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ms.json +15 -0
  179. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/mt.json +17 -0
  180. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/nc.json +29 -0
  181. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/nd.json +25 -0
  182. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ne.json +17 -0
  183. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/nh.json +12 -0
  184. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/nj.json +50 -0
  185. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/nm.json +20 -0
  186. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/nv.json +12 -0
  187. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ny.json +58 -0
  188. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/oh.json +48 -0
  189. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ok.json +17 -0
  190. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/or.json +18 -0
  191. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/pa.json +9 -0
  192. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ri.json +17 -0
  193. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/sc.json +17 -0
  194. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/sd.json +12 -0
  195. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/tn.json +12 -0
  196. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/ut.json +15 -0
  197. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/va.json +58 -0
  198. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/vt.json +17 -0
  199. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/wa.json +10 -0
  200. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/wi.json +17 -0
  201. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/wv.json +17 -0
  202. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/rates/wy.json +12 -0
  203. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/ak.json +26 -0
  204. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/al.json +26 -0
  205. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/ar.json +26 -0
  206. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/az.json +50 -0
  207. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/ca.json +96 -0
  208. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/co.json +50 -0
  209. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/ct.json +73 -0
  210. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/dc.json +26 -0
  211. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/de.json +26 -0
  212. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/fl.json +73 -0
  213. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/ga.json +168 -0
  214. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/hi.json +26 -0
  215. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/ia.json +26 -0
  216. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/id.json +26 -0
  217. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/il.json +73 -0
  218. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/in.json +26 -0
  219. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/ks.json +26 -0
  220. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/ky.json +26 -0
  221. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/la.json +50 -0
  222. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/ma.json +73 -0
  223. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/md.json +73 -0
  224. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/me.json +26 -0
  225. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/mi.json +26 -0
  226. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/mn.json +26 -0
  227. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/mo.json +26 -0
  228. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/ms.json +26 -0
  229. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/mt.json +26 -0
  230. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/nc.json +51 -0
  231. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/nd.json +26 -0
  232. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/ne.json +26 -0
  233. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/nh.json +26 -0
  234. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/nj.json +73 -0
  235. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/nm.json +26 -0
  236. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/nv.json +26 -0
  237. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/ny.json +95 -0
  238. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/oh.json +50 -0
  239. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/ok.json +26 -0
  240. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/or.json +26 -0
  241. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/pa.json +74 -0
  242. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/pr.json +796 -0
  243. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/ri.json +26 -0
  244. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/sc.json +26 -0
  245. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/sd.json +26 -0
  246. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/tn.json +26 -0
  247. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/tx.json +50 -0
  248. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/us.json +1747 -0
  249. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/ut.json +26 -0
  250. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/va.json +74 -0
  251. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/vt.json +26 -0
  252. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/wa.json +73 -0
  253. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/wi.json +26 -0
  254. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/wv.json +26 -0
  255. mcp_server_taxcode-1.0.0/src/taxcode_mcp/data/statutes/wy.json +26 -0
  256. mcp_server_taxcode-1.0.0/src/taxcode_mcp/db.py +821 -0
  257. mcp_server_taxcode-1.0.0/src/taxcode_mcp/paging.py +159 -0
  258. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/src/taxcode_mcp/ssrf.py +14 -9
  259. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/src/taxcode_mcp/tools/compliance.py +97 -491
  260. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/src/taxcode_mcp/tools/statutes.py +155 -38
  261. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/conftest.py +53 -0
  262. mcp_server_taxcode-1.0.0/tests/fake_network.py +150 -0
  263. mcp_server_taxcode-1.0.0/tests/fixtures/compliance_golden/compliance_calculate_built_in_gain_sourcing.jsonl.gz +0 -0
  264. mcp_server_taxcode-1.0.0/tests/fixtures/compliance_golden/compliance_cross_border_tax_analysis.jsonl.gz +0 -0
  265. mcp_server_taxcode-1.0.0/tests/fixtures/compliance_golden/compliance_evaluate_georgia_residency.jsonl.gz +0 -0
  266. mcp_server_taxcode-1.0.0/tests/fixtures/compliance_golden/compliance_evaluate_pr_bona_fide_residency.jsonl.gz +0 -0
  267. mcp_server_taxcode-1.0.0/tests/fixtures/compliance_golden/compliance_evaluate_state_residency.jsonl.gz +0 -0
  268. mcp_server_taxcode-1.0.0/tests/fixtures/compliance_golden/constants.json +5 -0
  269. mcp_server_taxcode-1.0.0/tests/golden_compliance.py +144 -0
  270. mcp_server_taxcode-1.0.0/tests/test_catalog.py +461 -0
  271. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_client.py +209 -0
  272. mcp_server_taxcode-1.0.0/tests/test_compliance_golden.py +46 -0
  273. mcp_server_taxcode-1.0.0/tests/test_conftest_auth_env.py +35 -0
  274. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_db.py +98 -1
  275. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_disclaimers.py +5 -1
  276. mcp_server_taxcode-1.0.0/tests/test_dockerfile.py +141 -0
  277. mcp_server_taxcode-1.0.0/tests/test_drift.py +235 -0
  278. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_federal.py +14 -5
  279. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_ingest.py +170 -53
  280. mcp_server_taxcode-1.0.0/tests/test_network_guard.py +25 -0
  281. mcp_server_taxcode-1.0.0/tests/test_paging.py +323 -0
  282. mcp_server_taxcode-1.0.0/tests/test_rate_tables.py +192 -0
  283. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_search_normalize.py +3 -2
  284. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_search_snippets.py +16 -3
  285. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_ssrf.py +18 -4
  286. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/uv.lock +187 -153
  287. mcp_server_taxcode-0.7.2/CONTRIBUTING.md +0 -10
  288. mcp_server_taxcode-0.7.2/Dockerfile +0 -48
  289. mcp_server_taxcode-0.7.2/SECURITY.md +0 -14
  290. mcp_server_taxcode-0.7.2/docs/llms-full.txt +0 -2719
  291. mcp_server_taxcode-0.7.2/docs/pr/ley60_2021_01.md +0 -17
  292. mcp_server_taxcode-0.7.2/docs/pr/ley60_2022_01.md +0 -17
  293. mcp_server_taxcode-0.7.2/docs/pr/ley60_2022_01_2019.md +0 -17
  294. mcp_server_taxcode-0.7.2/scripts/ingest_statutes.py +0 -7122
  295. mcp_server_taxcode-0.7.2/src/taxcode_mcp/db.py +0 -8103
  296. mcp_server_taxcode-0.7.2/tests/test_conftest_auth_env.py +0 -20
  297. mcp_server_taxcode-0.7.2/tests/test_drift.py +0 -141
  298. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/.github/dependabot.yml +0 -0
  299. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/.gitignore +0 -0
  300. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/CHANGELOG.md +0 -0
  301. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/CODE_OF_CONDUCT.md +0 -0
  302. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/LICENSE +0 -0
  303. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/conformance-baseline.yml +0 -0
  304. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ak/alaska stat._43_05_080.md +0 -0
  305. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/al/ala. code_40_18_2.md +0 -0
  306. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ar/a.c.a._26_51_201.md +0 -0
  307. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/az/a.r.s._43_1011.md +0 -0
  308. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/az/a.r.s._43_104.md +0 -0
  309. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ca/caccr_17014.md +0 -0
  310. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ca/rtc_17014.md +0 -0
  311. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ca/rtc_17041.md +0 -0
  312. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ca/rtc_17951.md +0 -0
  313. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/co/c.r.s._39_22_103.md +0 -0
  314. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/co/c.r.s._39_22_104.md +0 -0
  315. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ct/c.g.s._12_700.md +0 -0
  316. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ct/c.g.s._12_701.md +0 -0
  317. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ct/c.g.s._12_711.md +0 -0
  318. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/dc/d.c. code_47_1806_03.md +0 -0
  319. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/de/del. code_1102.md +0 -0
  320. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/fl/flconst_art__vii_sec__5.md +0 -0
  321. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/fl/flstat_196_031.md +0 -0
  322. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/fl/flstat_222_17.md +0 -0
  323. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ga/gareg_560_7_3__01.md +0 -0
  324. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ga/ocga_48_7_1.md +0 -0
  325. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ga/ocga_48_7_30.md +0 -0
  326. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/hi/hrs_235_51.md +0 -0
  327. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ia/iowa code_422_5.md +0 -0
  328. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/id/idaho code_63_3024.md +0 -0
  329. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/il/ilcs_5_1501_a_20.md +0 -0
  330. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/il/ilcs_5_201.md +0 -0
  331. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/il/ilcs_5_301.md +0 -0
  332. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/in/ind. code_6_3_2_1.md +0 -0
  333. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ks/k.s.a._79_32,110.md +0 -0
  334. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ky/krs_141_020.md +0 -0
  335. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/la/la. r.s._47_32.md +0 -0
  336. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/la/la. r.s._47_32_2022.md +0 -0
  337. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ma/maconst_art__xliv.md +0 -0
  338. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ma/mgl_62_1_f.md +0 -0
  339. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ma/mgl_62_4.md +0 -0
  340. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/md/md. code_10_101.md +0 -0
  341. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/md/md. code_10_105.md +0 -0
  342. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/md/md. code_10_106.md +0 -0
  343. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/me/36 m.r.s._5111.md +0 -0
  344. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/mi/mcl_206_51.md +0 -0
  345. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/mn/minn. stat._290_06.md +0 -0
  346. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/mo/rsmo_143_011.md +0 -0
  347. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ms/miss. code_27_7_5.md +0 -0
  348. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/mt/mca_15_30_2103.md +0 -0
  349. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/nc/n.c.g.s._105_153_3.md +0 -0
  350. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/nc/n.c.g.s._105_153_7.md +0 -0
  351. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/nd/n.d.c.c._57_38_30_3.md +0 -0
  352. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ne/neb. rev. stat._77_2715_03.md +0 -0
  353. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/nh/rsa_77_1_2024.md +0 -0
  354. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/nj/njac_18_35_5_2.md +0 -0
  355. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/nj/njsa_54a_1_2.md +0 -0
  356. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/nj/njsa_54a_2_1.md +0 -0
  357. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/nm/nmsa_7_2_7.md +0 -0
  358. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/nv/nev. const._art__10,_/302/247_1.md" +0 -0
  359. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ny/nycrr_105_20.md +0 -0
  360. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ny/nycrr_132_18.md +0 -0
  361. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ny/nytax_601.md +0 -0
  362. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ny/nytax_605.md +0 -0
  363. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/oh/r.c._5747_02.md +0 -0
  364. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/oh/r.c._5747_24.md +0 -0
  365. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ok/68 o.s._2355.md +0 -0
  366. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/or/ors_316_037.md +0 -0
  367. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/pa/p.s._7301.md +0 -0
  368. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/pa/p.s._7302.md +0 -0
  369. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/pa/pa. code_109_8.md +0 -0
  370. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/pr/cri_1010_01.md +0 -0
  371. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/pr/cri_1031_01.md +0 -0
  372. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/pr/cri_1031_02.md +0 -0
  373. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/pr/cri_1062_01.md +0 -0
  374. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/pr/cri_1062_03.md +0 -0
  375. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/pr/ley60_2031_01.md +0 -0
  376. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/pr/ley60_2032_01.md +0 -0
  377. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/pr/ley60_6070_55.md +0 -0
  378. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ri/r.i.g.l._44_30_1.md +0 -0
  379. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/sc/s.c. code_12_6_510.md +0 -0
  380. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/sd/s.d. const._art__xi,_/302/247_2.md" +0 -0
  381. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/tn/tenn. const._art__ii,_/302/247_28.md" +0 -0
  382. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/tx/txconst_art__viii_sec__24_a.md +0 -0
  383. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/tx/txtax_171_001.md +0 -0
  384. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/us/irc_1.md +0 -0
  385. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/us/irc_1411.md +0 -0
  386. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/us/irc_24.md +0 -0
  387. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/us/irc_32.md +0 -0
  388. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/us/irc_6012.md +0 -0
  389. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/us/irc_61.md +0 -0
  390. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/us/irc_62.md +0 -0
  391. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/us/irc_63.md +0 -0
  392. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/us/irc_6688.md +0 -0
  393. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/us/irc_865.md +0 -0
  394. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/us/irc_911.md +0 -0
  395. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/us/irc_933.md +0 -0
  396. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/us/irc_937.md +0 -0
  397. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/us/irc_957.md +0 -0
  398. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/ut/utah code_59_10_104.md +0 -0
  399. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/va/va. code_58_1_302.md +0 -0
  400. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/va/va. code_58_1_320.md +0 -0
  401. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/va/va. code_58_1_342.md +0 -0
  402. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/vt/32 v.s.a._5822.md +0 -0
  403. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/wa/rcw_82_87_020.md +0 -0
  404. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/wa/rcw_82_87_040.md +0 -0
  405. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/wa/waconst_art__vii_sec__1.md +0 -0
  406. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/wi/wis. stat._71_06.md +0 -0
  407. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/wv/w. va. code_11_21_4e.md +0 -0
  408. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/docs/wy/wyo. const._art__15,_/302/247_18.md" +0 -0
  409. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/scripts/check_conformance.sh +0 -0
  410. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/scripts/check_tool_contract.py +0 -0
  411. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/scripts/check_version.py +0 -0
  412. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/scripts/release_notes.py +0 -0
  413. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/server.json +0 -0
  414. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/src/taxcode_mcp/__init__.py +0 -0
  415. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/src/taxcode_mcp/auth.py +0 -0
  416. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/src/taxcode_mcp/config.py +0 -0
  417. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/src/taxcode_mcp/disclaimers.py +0 -0
  418. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/src/taxcode_mcp/errors.py +0 -0
  419. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/src/taxcode_mcp/middleware.py +0 -0
  420. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/src/taxcode_mcp/profiles.py +0 -0
  421. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/src/taxcode_mcp/server.py +0 -0
  422. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/src/taxcode_mcp/tools/__init__.py +0 -0
  423. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/src/taxcode_mcp/tools/system.py +0 -0
  424. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/fixtures/usc26_sample.xml +0 -0
  425. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_batch.py +0 -0
  426. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_check_version.py +0 -0
  427. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_code_mode_extra.py +0 -0
  428. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_config.py +0 -0
  429. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_e2e_live.py +0 -0
  430. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_errors.py +0 -0
  431. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_http_auth.py +0 -0
  432. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_layered.py +0 -0
  433. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_otel_spans.py +0 -0
  434. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_profiles.py +0 -0
  435. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_protocol.py +0 -0
  436. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_release_notes.py +0 -0
  437. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_server.py +0 -0
  438. {mcp_server_taxcode-0.7.2 → mcp_server_taxcode-1.0.0}/tests/test_version.py +0 -0
@@ -35,9 +35,11 @@ jobs:
35
35
  persist-credentials: false
36
36
 
37
37
  - name: Install uv
38
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
38
+ uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
39
39
  with:
40
- version: "latest"
40
+ # Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
41
+ # FastMCP's October 2026 certificate authority incident notice).
42
+ version-file: "pyproject.toml"
41
43
  enable-cache: true
42
44
 
43
45
  - name: Set up Python
@@ -63,7 +65,7 @@ jobs:
63
65
  strategy:
64
66
  fail-fast: false
65
67
  matrix:
66
- python-version: ["3.10", "3.11", "3.12", "3.13"]
68
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
67
69
  steps:
68
70
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
69
71
  with:
@@ -71,9 +73,11 @@ jobs:
71
73
  persist-credentials: false
72
74
 
73
75
  - name: Install uv
74
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
76
+ uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
75
77
  with:
76
- version: "latest"
78
+ # Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
79
+ # FastMCP's October 2026 certificate authority incident notice).
80
+ version-file: "pyproject.toml"
77
81
  enable-cache: true
78
82
 
79
83
  - name: Set up Python ${{ matrix.python-version }}
@@ -101,9 +105,11 @@ jobs:
101
105
  persist-credentials: false
102
106
 
103
107
  - name: Install uv
104
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
108
+ uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
105
109
  with:
106
- version: "latest"
110
+ # Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
111
+ # FastMCP's October 2026 certificate authority incident notice).
112
+ version-file: "pyproject.toml"
107
113
  enable-cache: true
108
114
 
109
115
  - name: Set up Python
@@ -120,6 +126,11 @@ jobs:
120
126
  - name: Verify OpenAPI drift
121
127
  run: uv run python scripts/check_openapi_drift.py
122
128
 
129
+ - name: Verify data files, source manifest and generated docs
130
+ # Fails when a data file breaks the schema or canonical form, a manifest entry is
131
+ # missing or disagrees with its row, or docs/ differs from the regenerated output.
132
+ run: uv run python scripts/build_catalog.py --check
133
+
123
134
  - name: Set up Node.js 22
124
135
  uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
125
136
  with:
@@ -138,9 +149,11 @@ jobs:
138
149
  persist-credentials: false
139
150
 
140
151
  - name: Install uv
141
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
152
+ uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
142
153
  with:
143
- version: "latest"
154
+ # Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
155
+ # FastMCP's October 2026 certificate authority incident notice).
156
+ version-file: "pyproject.toml"
144
157
 
145
158
  - name: Set up Python
146
159
  uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
@@ -184,3 +197,29 @@ jobs:
184
197
  exit 1
185
198
  fi
186
199
  echo "Image label matches ${EXPECTED}"
200
+
201
+ - name: Builder fails below the ca-certificates floor
202
+ # Raising CA_CERTIFICATES_FLOOR above any real Debian version makes the installed
203
+ # package older than the floor, whatever version the base image or trixie-security
204
+ # ships, so this is deterministic. The build must fail at the builder's floor check,
205
+ # with its message, and before the pip bootstrap step starts.
206
+ run: |
207
+ set +e
208
+ docker build --target builder --progress=plain \
209
+ --build-arg CA_CERTIFICATES_FLOOR=99991231 . > ca-floor.log 2>&1
210
+ status=$?
211
+ set -e
212
+ cat ca-floor.log
213
+ if [ "$status" -eq 0 ]; then
214
+ echo "::error::builder built with a ca-certificates floor above the installed version"
215
+ exit 1
216
+ fi
217
+ if ! grep -q "is older than the floor 99991231" ca-floor.log; then
218
+ echo "::error::builder failed, but not at the ca-certificates floor check"
219
+ exit 1
220
+ fi
221
+ if grep -q -- "--require-hashes" ca-floor.log; then
222
+ echo "::error::the pip bootstrap step started before the ca-certificates floor check failed"
223
+ exit 1
224
+ fi
225
+ echo "Builder stops at the ca-certificates floor check before any pip step"
@@ -28,11 +28,25 @@ jobs:
28
28
  with:
29
29
  github-token: "${{ secrets.GITHUB_TOKEN }}"
30
30
 
31
+ # Docker base image updates never auto-merge. The docker ecosystem can move the tag
32
+ # (python:3.12-slim -> 3.14-slim is a Python runtime upgrade that Dependabot labels
33
+ # semver-minor), so these PRs stay open for a human review.
34
+ - name: Leave Docker base image updates for review
35
+ if: steps.metadata.outputs.package-ecosystem == 'docker'
36
+ run: echo "::notice title=Not auto-merged::Docker base image update ($DEPS $PREV -> $NEW). Docker updates always wait for a human review."
37
+ env:
38
+ DEPS: ${{ steps.metadata.outputs.dependency-names }}
39
+ PREV: ${{ steps.metadata.outputs.previous-version }}
40
+ NEW: ${{ steps.metadata.outputs.new-version }}
41
+
31
42
  # Allowlist, not a major-version denylist: update-type is the highest change in the PR
32
43
  # (a grouped PR with one major is skipped), and it is empty when the PR carries a
33
44
  # non-Dependabot commit, so only minor and patch updates are auto-merged.
34
45
  - name: Enable auto-merge for semver-minor and semver-patch updates
35
- if: steps.metadata.outputs.update-type == 'version-update:semver-minor' || steps.metadata.outputs.update-type == 'version-update:semver-patch'
46
+ if: >-
47
+ steps.metadata.outputs.package-ecosystem != 'docker' &&
48
+ (steps.metadata.outputs.update-type == 'version-update:semver-minor' ||
49
+ steps.metadata.outputs.update-type == 'version-update:semver-patch')
36
50
  run: gh pr merge --auto --squash "$PR_URL"
37
51
  env:
38
52
  PR_URL: ${{ github.event.pull_request.html_url }}
@@ -28,9 +28,11 @@ jobs:
28
28
  persist-credentials: false
29
29
 
30
30
  - name: Install uv
31
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
31
+ uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
32
32
  with:
33
- version: "latest"
33
+ # Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
34
+ # FastMCP's October 2026 certificate authority incident notice).
35
+ version-file: "pyproject.toml"
34
36
  enable-cache: true
35
37
 
36
38
  - name: Set up Python
@@ -28,7 +28,9 @@ jobs:
28
28
  - name: Install uv
29
29
  uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
30
30
  with:
31
- version: "latest"
31
+ # Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
32
+ # FastMCP's October 2026 certificate authority incident notice).
33
+ version-file: "pyproject.toml"
32
34
  enable-cache: false
33
35
 
34
36
  - name: Set up Python
@@ -44,6 +44,9 @@ Host configuration JSON for these doc servers (`mcp_config.json` and other deskt
44
44
  - `src/<name>_mcp/auth.py` — `SharedTokenVerifier` (FastMCP `TokenVerifier`) for `<NAME>_MCP_AUTH_TOKEN` and the HTTP bind policy; the verifier is attached at server build, so `fastmcp run` and `http_app()` enforce the token too (`COOKBOOK.md` Recipe 8).
45
45
  - `src/<name>_mcp/tools/<domain>.py` — domain sub-servers (template ships `system.py`, `items.py`); re-exported from `tools/__init__.py`.
46
46
  - `src/<name>_mcp/client.py` — async HTTP client; `ssrf.py` — SSRF / DNS-rebinding guard; `errors.py` — exceptions and secret redaction; `middleware.py` — parent and child middleware; `config.py` — settings.
47
+ - `src/taxcode_mcp/data/` — the single source of truth for statute and publication rows: `jurisdictions.json` (catalog order), `statutes/<code>.json`, `publications/<code>.json`, `manifest/<code>.json` (one source record per row), and `rates/<code>.json` (the compliance tools' rate tables, one per state in `RATE_TABLE_MODELS`). `src/taxcode_mcp/catalog.py` loads and validates them; `db.py` seeds DuckDB from the rows, and `tools/compliance.py` reads every rate from the rate tables. Row layout, manifest fields and how to add a row: `CONTRIBUTING.md` (Adding or changing a row).
48
+ - `scripts/build_catalog.py` — rewrites the data files in canonical form and generates `docs/<code>/*.md`, `docs/<code>/llms-full.txt` (one jurisdiction's full text), `docs/llms.txt` and `docs/llms-full.txt` (the index of the per-jurisdiction files) from them; `--check` (run in CI and by `tests/test_catalog.py`) fails on a schema or canonical-form error (rate tables included, and a missing or stray rate table), an incomplete or mismatched manifest entry, or docs that differ from the generated output. Never edit generated docs by hand.
49
+ - `src/taxcode_mcp/paging.py` — hard response cap (32,000 characters of JSON) and paging for the statutes tools: `statutes_lookup_statute` pages long text (`page_cursor` / `next_cursor`), search and publications clamp `limit` to 1..25 items per call (`offset` / `next_offset`), and the `taxcode://statutes/{jurisdiction}/{section}{?page_cursor}` resource returns the same 8,000-character pages, ending a non-final page with the full URI of the next one (`...?page_cursor=`). The template has no `statutes/` segment of its own: the `statutes` mount namespace supplies it.
47
50
  - `scripts/check_tool_contract.py` — source of truth for the expected tool set and annotations. Do not hard-code tool counts elsewhere.
48
51
  - `scripts/check_openapi_drift.py`, `scripts/check_conformance.sh` + `conformance-baseline.yml` — drift and protocol conformance.
49
52
  - `tests/` — offline unit, layered-composition, and protocol tests; `test_e2e_live.py` is opt-in (`-m e2e`).
@@ -136,7 +139,10 @@ When translating an API documentation page, `llm.txt`, or OpenAPI specification
136
139
  - Tool execution errors reach the client as `tools/call` results with `isError: true` and the redacted message (`tool_error`, raised `from None` after the `except` block ends, so neither `__cause__` nor `__context__` holds the original exception); `ParentAuditMiddleware` logs the same redacted message. A batch tool's per-item errors and its `batch_failed` error (`tool_failure`, raised `from None` outside any `except` block) carry redacted messages too.
137
140
  - An unknown tool stays FastMCP 4.0.11's tool result (`isError: true`). The spec's JSON-RPC `-32602` (`Unknown tool: invalid_tool_name`) is a known gap; do not change the wire format. See `COOKBOOK.md` Recipe 12.
138
141
  3. **Multi-Stage Non-Root Containers**:
139
- - The `Dockerfile` must use a multi-stage build (`python:3.12-slim AS builder` $\rightarrow$ runtime, pulled from Docker Hub by tag) creating and executing under non-root `USER mcp` with virtual environment `/opt/venv`. The runtime stage carries `LABEL io.modelcontextprotocol.server.name` equal to the `server.json` `name` (MCP Registry OCI ownership check), and the default command stays stdio.
142
+ - The `Dockerfile` must use a multi-stage build (`python:3.14-slim 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
+ - 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
+ - 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
+ - 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.
140
146
  4. **Registry Metadata Constraint**:
141
147
  - In `server.json`, the root `description` must be **strictly $\le$ 100 characters** to pass MCP Registry schema validation (longer strings trigger HTTP 422 errors).
142
148
  - The default package transport is `stdio`, and packages must specify `"runtimeHint": "uvx"`.
@@ -144,7 +150,7 @@ When translating an API documentation page, `llm.txt`, or OpenAPI specification
144
150
  - `<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).
145
151
  - 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).
146
152
  6. **SSRF & DNS Rebinding Defense**:
147
- - 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.
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.
148
154
  7. **Defensive API Contracts & Payload Hardening**:
149
155
  - 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.
150
156
  8. **Git Safety & Streamlined Releases**:
@@ -163,6 +169,8 @@ When translating an API documentation page, `llm.txt`, or OpenAPI specification
163
169
 
164
170
  ## 🛠️ Development & Verification Commands
165
171
 
172
+ uv 0.13.4 or later is required (`[tool.uv] required-version` in `pyproject.toml`, from FastMCP's certificate authority incident notice); older uv refuses to run, and CI's `setup-uv` installs from that setting.
173
+
166
174
  ```bash
167
175
  # Install editable with dev dependencies
168
176
  uv sync --locked --extra dev
@@ -182,6 +190,9 @@ uv run python scripts/check_tool_contract.py
182
190
  # Upstream OpenAPI / route drift check
183
191
  uv run python scripts/check_openapi_drift.py
184
192
 
193
+ # Data files, source manifest and generated docs are current
194
+ uv run python scripts/build_catalog.py --check
195
+
185
196
  # Protocol integration tests (stdio handshake & stateless streamable HTTP)
186
197
  uv run pytest tests/test_protocol.py
187
198
 
@@ -199,6 +210,6 @@ coderabbit review --agent --uncommitted
199
210
 
200
211
  ## 🔄 CI & Releases
201
212
 
202
- CI is defined in `.github/workflows/ci.yml` (jobs: `lint-and-types`, `test` on Python 3.10–3.13, `tool-contract`, `build-check`, `docker-build` (builds the image without pushing and checks its MCP server-name label against `server.json`)). 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.
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.
203
214
 
204
215
  `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.
@@ -0,0 +1,59 @@
1
+ # Contributing Guidelines
2
+
3
+ Thank you for your interest in contributing!
4
+
5
+ 1. Fork or branch from `main`: `git checkout -b feat/your-feature`.
6
+ 2. Ensure strict static typing: `mypy --strict src/`.
7
+ 3. Ensure the test suite passes: `pytest` (coverage threshold configured in `pyproject.toml`).
8
+ 4. Validate tool contracts: `python scripts/check_tool_contract.py`.
9
+ 5. Open a Pull Request. Merges are performed via **Squash Merge** with Conventional Commit titles (`feat:`, `fix:`, `docs:`, `chore:`).
10
+ 6. Changing statute or publication rows? Follow "Adding or changing a row" below and run `uv run python scripts/build_catalog.py --check`.
11
+ 7. Do not edit version numbers or `CHANGELOG.md`: the git tag is the version, and GitHub Releases are the changelog. The squash commit message is the PR body, so a breaking (`feat!:` / `fix!:`) PR ends its body with one `BREAKING CHANGE:` final paragraph that lists the breaking items, with no migration steps.
12
+
13
+ ## Adding or changing a row
14
+
15
+ Statute and publication rows live only in the data files under `src/taxcode_mcp/data/`. The server seeds its database from them, and `scripts/ingest_statutes.py` and the docs read them too. Never add rows as Python literals.
16
+
17
+ | File | Holds |
18
+ | --- | --- |
19
+ | `jurisdictions.json` | Jurisdiction codes in catalog order. Rows load in this order, then in file order. |
20
+ | `statutes/<code>.json` | One jurisdiction's statute rows (`us.json`, `pr.json`, `ga.json`, ...). `text_en` and `text_es` are lists of lines, joined with a newline when loaded. |
21
+ | `publications/<code>.json` | Publications whose `id` starts with `<code>-`. |
22
+ | `manifest/<code>.json` | One source record per statute and publication row and per rate table of that jurisdiction. |
23
+ | `rates/<code>.json` | The rate table the compliance tools compute a state's tax from. See "Changing a rate table" below. |
24
+
25
+ Every manifest entry has every field below. A value we don't have is the explicit string `"not_recorded"`, never a missing key and never a guess.
26
+
27
+ | Field | Meaning |
28
+ | --- | --- |
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`. |
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
+ | `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
+ | `licence` | Reuse terms of the source, or `"not_recorded"`. |
34
+ | `retrieved` | Date the source was fetched (`YYYY-MM-DD`), or `"not_recorded"`. |
35
+ | `content_sha256` | SHA-256 of the fetched source artifact, or `"not_recorded"`. |
36
+ | `enacting_law` | Law that enacted or last amended the text, or `"not_recorded"`. |
37
+ | `effective_date` | Date the text took effect (`YYYY-MM-DD`), or `"not_recorded"`. |
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
+
40
+ To add or change a row:
41
+
42
+ 1. Edit the row in `statutes/<code>.json` or `publications/<code>.json`. A new prior-year version is a new row with its own `id` and `effective_year`; set `superseded_year` on the version it replaces. Never copy current text into an earlier year.
43
+ 2. Add or update its entry in `manifest/<code>.json`.
44
+ 3. Run `uv run python scripts/build_catalog.py`. It rewrites the data files in canonical form and regenerates `docs/<code>/*.md`, `docs/<code>/llms-full.txt` (that jurisdiction's full text), `docs/llms.txt` and `docs/llms-full.txt` (an index of the per-jurisdiction files), so a content PR only changes the full-text file of the jurisdictions it touches.
45
+ 4. Run `uv run python scripts/build_catalog.py --check` and the test suite. CI runs the same check and fails if a data file, a manifest entry or a generated docs file is out of step.
46
+
47
+ A new jurisdiction also needs its code in `jurisdictions.json` and, for its name to resolve, in `JURISDICTION_NAMES` (`src/taxcode_mcp/db.py`). Content-only PRs touch just the data files, the manifest and the generated docs; keep code changes in their own PR.
48
+
49
+ ## Changing a rate table
50
+
51
+ Every deduction, exemption, bracket, rate and per-year value the compliance tools use lives in `src/taxcode_mcp/data/rates/<code>.json`, one file per state that has one (`RATE_TABLE_MODELS` in `src/taxcode_mcp/catalog.py`). FL and TX have none. Never add a rate as a Python literal.
52
+
53
+ - `model` names the shape of `params` and which formula reads it. It must match `RATE_TABLE_MODELS`.
54
+ - Amounts and rates are floats (`1000.0`, not `1000`), because tool output prints them as stored.
55
+ - `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
+ - `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.
58
+
59
+ 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.
@@ -0,0 +1,83 @@
1
+ # Multi-stage build for mcp-server-taxcode
2
+ # Produces a minimal runtime image (~150MB) with no dev tooling.
3
+ #
4
+ # The base image is the Docker Official python image pulled from Docker Hub,
5
+ # pinned by its multi-arch index digest. Dependabot's docker ecosystem keeps the
6
+ # digest current.
7
+ # No `# syntax=` line: the Dockerfile uses only features of BuildKit's built-in
8
+ # frontend, so no frontend image is pulled.
9
+
10
+ # FastMCP's October 2026 certificate authority incident notice says to update the
11
+ # container's OS trust store: older base images ship a ca-certificates that predates the fix.
12
+ # Debian shipped 20250419+deb13u1 in trixie-security. Both stages upgrade the package and
13
+ # fail the build if the installed version is older than this floor, so a base image change
14
+ # cannot drop the fix. The builder does it before any pip runs, because pip trusts the OS
15
+ # store as well as its bundled certifi.
16
+ # https://github.com/PrefectHQ/fastmcp/pull/5945 (notice) and
17
+ # https://security-tracker.debian.org/tracker/DSA-6572-1 (Debian floor)
18
+ ARG CA_CERTIFICATES_FLOOR=20250419+deb13u1
19
+
20
+ # ─── Stage 1: Builder ─────────────────────────────────────────────────────────
21
+ FROM python:3.14-slim@sha256:fbecd461fc72d21b2143c6eaba25143738079154a6d0ea3da3aec724f50eed4a AS builder
22
+
23
+ ARG CA_CERTIFICATES_FLOOR
24
+ RUN apt-get update && \
25
+ apt-get install -y --no-install-recommends --only-upgrade ca-certificates && \
26
+ rm -rf /var/lib/apt/lists/* && \
27
+ installed="$(dpkg-query -W -f='${Version}' ca-certificates)" && \
28
+ { dpkg --compare-versions "$installed" ge "$CA_CERTIFICATES_FLOOR" || \
29
+ { echo "ca-certificates $installed is older than the floor $CA_CERTIFICATES_FLOOR" >&2; exit 1; }; }
30
+
31
+ WORKDIR /app
32
+
33
+ # Install build deps in a virtualenv so we can copy it cleanly
34
+ RUN python -m venv /opt/venv
35
+ ENV PATH="/opt/venv/bin:$PATH"
36
+
37
+ COPY docker/pip-bootstrap.txt /tmp/pip-bootstrap.txt
38
+ COPY pyproject.toml README.md LICENSE ./
39
+ COPY src/ src/
40
+
41
+ # The build context has no .git, so uv-dynamic-versioning cannot read the tag and
42
+ # falls back to 0.0.0. Release builds pass the tag version, for example
43
+ # --build-arg UV_DYNAMIC_VERSIONING_BYPASS=1.3.1 (an unset or empty value keeps 0.0.0).
44
+ ARG UV_DYNAMIC_VERSIONING_BYPASS
45
+ ENV UV_DYNAMIC_VERSIONING_BYPASS=${UV_DYNAMIC_VERSIONING_BYPASS}
46
+
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.
49
+ # https://github.com/PrefectHQ/fastmcp/blob/main/SECURITY.md#certificate-authority-incident-october-2026
50
+ # The bootstrap installs pip from a hash-pinned wheel (docker/pip-bootstrap.txt, --require-hashes),
51
+ # so it does not depend on the TLS trust of the base image's older pip and certifi; the maintainer
52
+ # who raises the pip floor updates that pin and its sha256 (Dependabot does not track the file).
53
+ RUN pip install --no-cache-dir --require-hashes --only-binary=:all: -r /tmp/pip-bootstrap.txt && \
54
+ pip install --no-cache-dir .
55
+
56
+ # ─── Stage 2: Runtime ─────────────────────────────────────────────────────────
57
+ FROM python:3.14-slim@sha256:fbecd461fc72d21b2143c6eaba25143738079154a6d0ea3da3aec724f50eed4a AS runtime
58
+
59
+ # MCP Registry ownership check for the OCI package: must equal server.json "name".
60
+ # https://modelcontextprotocol.io/registry/package-types#docker%2Foci-images
61
+ LABEL io.modelcontextprotocol.server.name="io.github.christianclaudio/taxcode"
62
+
63
+ # OS trust store update and floor check, the same as the builder (see CA_CERTIFICATES_FLOOR).
64
+ ARG CA_CERTIFICATES_FLOOR
65
+ RUN apt-get update && \
66
+ apt-get install -y --no-install-recommends --only-upgrade ca-certificates && \
67
+ rm -rf /var/lib/apt/lists/* && \
68
+ installed="$(dpkg-query -W -f='${Version}' ca-certificates)" && \
69
+ { dpkg --compare-versions "$installed" ge "$CA_CERTIFICATES_FLOOR" || \
70
+ { echo "ca-certificates $installed is older than the floor $CA_CERTIFICATES_FLOOR" >&2; exit 1; }; }
71
+
72
+ # Security: run as non-root
73
+ RUN useradd --create-home --shell /bin/bash mcp
74
+ USER mcp
75
+ WORKDIR /home/mcp
76
+
77
+ # Copy the pre-built virtualenv from builder
78
+ COPY --from=builder /opt/venv /opt/venv
79
+ ENV PATH="/opt/venv/bin:$PATH"
80
+
81
+ # Default transport is stdio, so no port is exposed
82
+ ENTRYPOINT ["taxcode-mcp"]
83
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: mcp-server-taxcode
3
- Version: 0.7.2
3
+ Version: 1.0.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
@@ -20,18 +20,20 @@ Classifier: Programming Language :: Python :: 3.10
20
20
  Classifier: Programming Language :: Python :: 3.11
21
21
  Classifier: Programming Language :: Python :: 3.12
22
22
  Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Programming Language :: Python :: 3.14
23
24
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
25
  Requires-Python: >=3.10
26
+ Requires-Dist: certifi>=2026.10.19
25
27
  Requires-Dist: duckdb>=1.5.6
26
- Requires-Dist: fastmcp>=4.1.1
28
+ Requires-Dist: fastmcp>=4.1.3
27
29
  Requires-Dist: httpx>=0.28.1
28
30
  Requires-Dist: mcp>=2.3.0
29
31
  Requires-Dist: pydantic-settings>=2.15.0
30
32
  Requires-Dist: pydantic>=2.13.5
31
33
  Provides-Extra: code-mode
32
- Requires-Dist: fastmcp[code-mode]>=4.1.1; extra == 'code-mode'
34
+ Requires-Dist: fastmcp[code-mode]>=4.1.3; extra == 'code-mode'
33
35
  Provides-Extra: dev
34
- Requires-Dist: fastmcp[code-mode]>=4.1.1; extra == 'dev'
36
+ Requires-Dist: fastmcp[code-mode]>=4.1.3; extra == 'dev'
35
37
  Requires-Dist: mypy>=2.4.0; extra == 'dev'
36
38
  Requires-Dist: opentelemetry-sdk>=1.45.1; extra == 'dev'
37
39
  Requires-Dist: pytest-asyncio>=1.4.0; extra == 'dev'
@@ -68,7 +70,7 @@ graph TD
68
70
  Gateway["FastMCP Root Gateway<br>(stdio / streamable-http)"]
69
71
  ParentMW["Parent Middleware<br>(Audit Logging, Timing, Secret Redaction, ReadOnly Gate)"]
70
72
  SysSub["System Sub-server (mount: 'system')<br>• system_get_health_status<br>• taxcode://system/reference/capabilities"]
71
- StatSub["Statutes Sub-server (mount: 'statutes')<br>• statutes_lookup_statute<br>• statutes_search_tax_code<br>• statutes_list_publications"]
73
+ StatSub["Statutes Sub-server (mount: 'statutes')<br>• statutes_lookup_statute<br>• statutes_search_tax_code<br>• statutes_list_publications<br>• taxcode://statutes/{jurisdiction}/{section}"]
72
74
  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"]
73
75
  DuckDB["DuckDB In-Memory & File Engine<br>(117 Statutes, 18 Publications, Full-Text Search, Temporal Versions)"]
74
76
 
@@ -90,6 +92,8 @@ graph TD
90
92
  * **Puerto Rico (`PR`)**: Act 60-2019 (Resident Individual Investors, Export Services & Opportunity Zone definitions, Sec. 6020.10 annual reports), Ley 1-2011 (including Sec. 1031.02 exemptions and Sec. 1062.01 wage withholding and Sec. 1062.03 withholding on payments for services), Act 22-2012 predecessor versions, and administrative publications (CC RI 21-10, CC RI 25-12, CC RI 26-13, DA 21-04, DA 23-04, BI RI 26-02).
91
93
  * **All 50 US States + District of Columbia**: Comprehensive statutory definitions and tax computations covering no-income-tax states (AK, FL, NV, NH, SD, TN, TX, WA, WY), flat-tax regimes (AZ, CO, GA, ID, IL, IN, IA, KS, KY, MI, MS, NC, PA, UT), and graduated/surtax jurisdictions (AL, AR, CA, CT, DE, DC, HI, LA, ME, MD, MA, MN, MO, MT, NE, NJ, NM, NY, ND, OH, OK, OR, RI, SC, VT, VA, WV, WI) including Convenience of the Employer rules (NY, PA, NJ, CT, DE, NE) and local piggyback taxes (MD, IN, OH, NY).
92
94
  * **Snippet Search, Full Text by Id**: `statutes_search_tax_code` matches and ranks on the full text but returns a short snippet (up to 300 characters around the first matched term) plus each result's `id`, citation, title, jurisdiction, year, validity and content labels. Pass an `id` to `statutes_lookup_statute` as `citation_or_section` for the full text.
95
+ * **Bounded Responses with Paging**: Every statutes tool result stays under 32,000 characters of JSON. `statutes_lookup_statute` returns long text in pages of up to 8,000 characters per text field (`text_page` gives the offset and full lengths; pass `next_cursor` back as `page_cursor` for the next page). `statutes_search_tax_code` and `statutes_list_publications` clamp `limit` to 1..25 items per call, with `offset` and `next_offset` for the next page. The `taxcode://statutes/{jurisdiction}/{section}` resource (for example `taxcode://statutes/US/933`) uses the same 8,000-character pages and cap: a page that is not the last ends with the URI of the next one, which carries a `?page_cursor=` query.
96
+ * **Versioned Data Files**: Every statute and publication row lives in per-jurisdiction JSON under `src/taxcode_mcp/data/` with a source record per row, and the docs under `docs/` are generated from them (see [`CONTRIBUTING.md`](CONTRIBUTING.md)).
93
97
  * **Temporal Statutory Versioning**: Point-in-time statutory lookup with `superseded_year` filtering and descending historical ordering (`tax_year` parameter).
94
98
  * **Deterministic Compliance Engines**:
95
99
  * `evaluate_pr_bona_fide_residency`: Evaluates IRC § 937 presence (183-day, 549-day 3-year, 90-day US), tax home, and closer connection tests.
@@ -304,6 +308,7 @@ uv run ruff format --check .
304
308
  # 4. Tool contract, protocol & drift assertions
305
309
  uv run python scripts/check_tool_contract.py
306
310
  uv run python scripts/check_openapi_drift.py
311
+ uv run python scripts/build_catalog.py --check # data files, source manifest, generated docs
307
312
  uv run pytest tests/test_protocol.py
308
313
  uv run pytest tests/test_e2e_live.py -m e2e # on demand; default CI uses -m 'not e2e'
309
314
  ./scripts/check_conformance.sh
@@ -25,7 +25,7 @@ graph TD
25
25
  Gateway["FastMCP Root Gateway<br>(stdio / streamable-http)"]
26
26
  ParentMW["Parent Middleware<br>(Audit Logging, Timing, Secret Redaction, ReadOnly Gate)"]
27
27
  SysSub["System Sub-server (mount: 'system')<br>• system_get_health_status<br>• taxcode://system/reference/capabilities"]
28
- StatSub["Statutes Sub-server (mount: 'statutes')<br>• statutes_lookup_statute<br>• statutes_search_tax_code<br>• statutes_list_publications"]
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
30
  DuckDB["DuckDB In-Memory & File Engine<br>(117 Statutes, 18 Publications, Full-Text Search, Temporal Versions)"]
31
31
 
@@ -47,6 +47,8 @@ graph TD
47
47
  * **Puerto Rico (`PR`)**: Act 60-2019 (Resident Individual Investors, Export Services & Opportunity Zone definitions, Sec. 6020.10 annual reports), Ley 1-2011 (including Sec. 1031.02 exemptions and Sec. 1062.01 wage withholding and Sec. 1062.03 withholding on payments for services), Act 22-2012 predecessor versions, and administrative publications (CC RI 21-10, CC RI 25-12, CC RI 26-13, DA 21-04, DA 23-04, BI RI 26-02).
48
48
  * **All 50 US States + District of Columbia**: Comprehensive statutory definitions and tax computations covering no-income-tax states (AK, FL, NV, NH, SD, TN, TX, WA, WY), flat-tax regimes (AZ, CO, GA, ID, IL, IN, IA, KS, KY, MI, MS, NC, PA, UT), and graduated/surtax jurisdictions (AL, AR, CA, CT, DE, DC, HI, LA, ME, MD, MA, MN, MO, MT, NE, NJ, NM, NY, ND, OH, OK, OR, RI, SC, VT, VA, WV, WI) including Convenience of the Employer rules (NY, PA, NJ, CT, DE, NE) and local piggyback taxes (MD, IN, OH, NY).
49
49
  * **Snippet Search, Full Text by Id**: `statutes_search_tax_code` matches and ranks on the full text but returns a short snippet (up to 300 characters around the first matched term) plus each result's `id`, citation, title, jurisdiction, year, validity and content labels. Pass an `id` to `statutes_lookup_statute` as `citation_or_section` for the full text.
50
+ * **Bounded Responses with Paging**: Every statutes tool result stays under 32,000 characters of JSON. `statutes_lookup_statute` returns long text in pages of up to 8,000 characters per text field (`text_page` gives the offset and full lengths; pass `next_cursor` back as `page_cursor` for the next page). `statutes_search_tax_code` and `statutes_list_publications` clamp `limit` to 1..25 items per call, with `offset` and `next_offset` for the next page. The `taxcode://statutes/{jurisdiction}/{section}` resource (for example `taxcode://statutes/US/933`) uses the same 8,000-character pages and cap: a page that is not the last ends with the URI of the next one, which carries a `?page_cursor=` query.
51
+ * **Versioned Data Files**: Every statute and publication row lives in per-jurisdiction JSON under `src/taxcode_mcp/data/` with a source record per row, and the docs under `docs/` are generated from them (see [`CONTRIBUTING.md`](CONTRIBUTING.md)).
50
52
  * **Temporal Statutory Versioning**: Point-in-time statutory lookup with `superseded_year` filtering and descending historical ordering (`tax_year` parameter).
51
53
  * **Deterministic Compliance Engines**:
52
54
  * `evaluate_pr_bona_fide_residency`: Evaluates IRC § 937 presence (183-day, 549-day 3-year, 90-day US), tax home, and closer connection tests.
@@ -261,6 +263,7 @@ uv run ruff format --check .
261
263
  # 4. Tool contract, protocol & drift assertions
262
264
  uv run python scripts/check_tool_contract.py
263
265
  uv run python scripts/check_openapi_drift.py
266
+ uv run python scripts/build_catalog.py --check # data files, source manifest, generated docs
264
267
  uv run pytest tests/test_protocol.py
265
268
  uv run pytest tests/test_e2e_live.py -m e2e # on demand; default CI uses -m 'not e2e'
266
269
  ./scripts/check_conformance.sh
@@ -0,0 +1,18 @@
1
+ # Security Policy
2
+
3
+ ## Supported Versions
4
+
5
+ Only the latest release receives security fixes. Upgrade to the newest version on [Releases](https://github.com/christianclaudio/mcp-server-taxcode/releases).
6
+
7
+ ## Outbound Connections and Proxies
8
+
9
+ Every outbound request (the upstream API client, the drift monitor's `--spec-url` fetch and `ingest_statutes.py --check-upstream`) goes through `SSRFSafeAsyncTransport`. It looks the host up once per request, checks every address against the private, loopback, link-local, reserved and metadata ranges, and connects only to a checked address, keeping the hostname for the Host header, TLS SNI and certificate verification. Redirects are not followed. httpx ignores env proxies whenever a transport is passed (httpx `AsyncClient`: `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.
10
+
11
+ ## Reporting a Vulnerability
12
+
13
+ If you discover a security vulnerability, please do NOT open a public GitHub issue.
14
+
15
+ Please report vulnerabilities directly to the maintainer:
16
+ * **Email**: `christianclaudio@mail.com`
17
+
18
+ All reports will be acknowledged within 24 hours, and patches will be published with high priority.
@@ -0,0 +1,5 @@
1
+ # pip for the Dockerfile builder's bootstrap, installed with --require-hashes so the install
2
+ # does not depend on TLS trust. Hash of pip-26.2.2-py3-none-any.whl from PyPI's JSON API
3
+ # (digests.sha256). Bump this pin and hash together with the pip floor; Dependabot does not.
4
+ pip==26.2.2 \
5
+ --hash=sha256:fd7f4dfa8190e014013b9f08f3e973f4e4c26ffd179a204895533a7254813a70
@@ -0,0 +1,10 @@
1
+ # Full Statutory Corpus: AK
2
+
3
+ ## Alaska Stat. § 43.05.080: Revenue Administration and Absence of Individual Income Tax
4
+ `Alaska Stat. > Title 43 > Chapter 05 > § 43.05.080`
5
+
6
+ ### English
7
+ Empowers the Department of Revenue to administer tax laws, operating alongside the historic repeal of former AS 43.20 individual income tax by Ch. 1, SLA 1980.
8
+
9
+ ### Español
10
+ Faculta al Departamento de Ingresos a reglamentar la administración tributaria estatal, tras la histórica derogación del impuesto individual por el Cap. 1, SLA 1980.
@@ -0,0 +1,10 @@
1
+ # Full Statutory Corpus: AL
2
+
3
+ ## Ala. Code § 40-18-2: Tax on Individuals
4
+ `Ala. Code > Title 40 > Chapter 18 > § 40-18-2`
5
+
6
+ ### English
7
+ Imposes graduated individual income tax rates of 2%, 4%, and 5% on taxable net income of individuals in Alabama.
8
+
9
+ ### Español
10
+ Impone tasas impositivas individuales graduadas del 2%, 4% y 5% sobre el ingreso neto gravable de individuos en Alabama.
@@ -0,0 +1,10 @@
1
+ # Full Statutory Corpus: AR
2
+
3
+ ## Ark. Code Ann. § 26-51-201: Tax on Individuals, Trusts, and Estates
4
+ `A.C.A. > Title 26 > Subtitle 5 > Chapter 51 > Subchapter 2 > § 26-51-201`
5
+
6
+ ### English
7
+ Imposes individual income tax with graduated brackets and top rate of 3.90% under Arkansas Act 1 of 2024.
8
+
9
+ ### Español
10
+ Impone impuesto sobre el ingreso individual con tramos graduados y tasa máxima de 3.90% bajo la Ley 1 de 2024 de Arkansas.
@@ -0,0 +1,19 @@
1
+ # Full Statutory Corpus: AZ
2
+
3
+ ## A.R.S. § 43-1011: Taxes and Tax Rates - Individuals
4
+ `A.R.S. > Title 43 > Chapter 10 > Article 1 > § 43-1011`
5
+
6
+ ### English
7
+ Imposes a flat individual income tax rate of 2.50% on Arizona taxable income, enacted by SB 1828 to replace graduated individual tax brackets.
8
+
9
+ ### Español
10
+ Impone una tasa impositiva fija del 2.50% sobre el ingreso gravable de Arizona de individuos, promulgada bajo SB 1828 eliminando tramos graduales anteriores.
11
+
12
+ ## A.R.S. § 43-104: Definitions - Resident and Presumption of Residency
13
+ `A.R.S. > Title 43 > Chapter 1 > Article 1 > § 43-104`
14
+
15
+ ### English
16
+ Defines resident as every individual in Arizona for other than a temporary or transitory purpose; individuals spending in the aggregate more than nine months (270 days) of the tax year in state are presumed residents.
17
+
18
+ ### Español
19
+ Define residente como todo individuo en Arizona para fines no temporales ni transitorios; quien pase en agregado más de nueve meses (270 días) en el estado se presume residente.
@@ -0,0 +1,37 @@
1
+ # Full Statutory Corpus: CA
2
+
3
+ ## Cal. Rev. & Tax Code § 17014: Definition of Resident (Non-Temporary Purpose Test)
4
+ `Cal. Rev. & Tax Code > Part 10 > Chapter 1 > § 17014`
5
+
6
+ ### English
7
+ Defines resident as every individual who is in California for other than a temporary or transitory purpose, and every individual domiciled in California who is outside the state for a temporary or transitory purpose. Presumption under § 17016 at 9 months.
8
+
9
+ ### Español
10
+ Define residente como todo individuo que permanezca en California para fines que no sean temporales o transitorios, y todo domiciliado que esté fuera del estado de forma temporal. Aplica el criterio de conexión más cercana.
11
+
12
+ ## Cal. Rev. & Tax Code § 17041: Individual Income Tax Rates and Brackets
13
+ `Cal. Rev. & Tax Code > Part 10 > Chapter 2 > § 17041`
14
+
15
+ ### English
16
+ Imposes graduated income tax rates on California taxable income ranging from 1% to 12.3%, plus a 1% Mental Health Services Tax surcharge on taxable income exceeding $1,000,000, creating a top marginal individual rate of 13.3%.
17
+
18
+ ### Español
19
+ Grava el ingreso tributable de California con tasas escalonadas del 1% al 12.3%, más 1% de recargo para servicios de salud mental sobre ingresos mayores a $1M (Proposición 63), para una tasa marginal máxima de 13.3%.
20
+
21
+ ## Cal. Rev. & Tax Code § 17951: Gross Income of Nonresidents and Sourcing
22
+ `Cal. Rev. & Tax Code > Part 10 > Chapter 9 > § 17951`
23
+
24
+ ### English
25
+ In the case of nonresidents, gross income includes only gross income from sources within California, including income from a business, trade, or profession conducted in the state, and compensation for personal services performed in California.
26
+
27
+ ### Español
28
+ Para no residentes, el ingreso bruto comprende únicamente ingresos derivados de fuentes en California, incluyendo negocios, profesiones y servicios personales realizados dentro del estado.
29
+
30
+ ## 18 CCR § 17014: FTB Residence and Domicile Guidelines
31
+ `18 CCR > Division 3 > Chapter 2.5 > Subchapter 1 > § 17014`
32
+
33
+ ### English
34
+ FTB regulation detailing domicile and residence determination. A person may have multiple residences but only one domicile. Applies the closest connection test evaluating real property, family, bank accounts, business affiliations, and licenses.
35
+
36
+ ### Español
37
+ Reglamento de la FTB sobre residencia y domicilio. Aplica el criterio de conexión más cercana evaluando propiedades inmuebles, familia, cuentas bancarias, licencias profesionales y afiliaciones comerciales.
@@ -0,0 +1,19 @@
1
+ # Full Statutory Corpus: CO
2
+
3
+ ## Colo. Rev. Stat. § 39-22-104: Levy of Tax - Single Rate for Individuals
4
+ `C.R.S. > Title 39 > Article 22 > Part 1 > § 39-22-104`
5
+
6
+ ### English
7
+ Imposes a flat tax of 4.40% on Colorado modified federal taxable income of individuals pursuant to voter-approved Proposition 121 (reduced from 4.55%).
8
+
9
+ ### Español
10
+ Impone una tasa uniforme del 4.40% sobre el ingreso federal tributable modificado de individuos de Colorado bajo la Proposición 121 aprobada por los electores.
11
+
12
+ ## Colo. Rev. Stat. § 39-22-103: Definitions - Resident Individual
13
+ `C.R.S. > Title 39 > Article 22 > Part 1 > § 39-22-103`
14
+
15
+ ### English
16
+ Defines a resident individual as one domiciled in Colorado, or who maintains a permanent place of abode in Colorado and spends in the aggregate more than six months of the taxable year in Colorado.
17
+
18
+ ### Español
19
+ Define individuo residente como quien tiene domicilio en Colorado, o mantiene morada permanente y pasa en agregado más de seis meses del año contributivo en Colorado.