mcp-server-taxcode 1.1.0__tar.gz → 1.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (646) hide show
  1. mcp_server_taxcode-1.3.0/.github/CODEOWNERS +1 -0
  2. mcp_server_taxcode-1.3.0/.github/dependabot.yml +58 -0
  3. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/.github/workflows/ci.yml +108 -18
  4. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/.github/workflows/release.yml +6 -6
  5. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/AGENTS.md +4 -3
  6. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/CONTRIBUTING.md +13 -7
  7. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/Dockerfile +25 -4
  8. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/PKG-INFO +10 -10
  9. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/README.md +5 -4
  10. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/conformance-baseline.yml +10 -6
  11. mcp_server_taxcode-1.3.0/docker/build-backend.txt +26 -0
  12. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docker/pip-bootstrap.txt +3 -3
  13. mcp_server_taxcode-1.3.0/docker/uv-bootstrap.txt +26 -0
  14. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ca/caccr_17014.md +2 -2
  15. mcp_server_taxcode-1.3.0/docs/ca/llms-full.txt +174 -0
  16. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ca/rtc_17014.md +2 -2
  17. mcp_server_taxcode-1.3.0/docs/ca/rtc_17015.md +17 -0
  18. mcp_server_taxcode-1.3.0/docs/ca/rtc_17016.md +17 -0
  19. mcp_server_taxcode-1.3.0/docs/ca/rtc_17041.md +17 -0
  20. mcp_server_taxcode-1.3.0/docs/ca/rtc_17041_i.md +17 -0
  21. mcp_server_taxcode-1.3.0/docs/ca/rtc_17043.md +17 -0
  22. mcp_server_taxcode-1.3.0/docs/ca/rtc_17043_2024.md +17 -0
  23. mcp_server_taxcode-1.3.0/docs/ca/rtc_17052_10.md +17 -0
  24. mcp_server_taxcode-1.3.0/docs/ca/rtc_17054.md +17 -0
  25. mcp_server_taxcode-1.3.0/docs/ca/rtc_17062.md +17 -0
  26. mcp_server_taxcode-1.3.0/docs/ca/rtc_17071.md +17 -0
  27. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ca/rtc_17951.md +2 -2
  28. mcp_server_taxcode-1.3.0/docs/ca/rtc_17952.md +17 -0
  29. mcp_server_taxcode-1.3.0/docs/ca/rtc_17952_5.md +17 -0
  30. mcp_server_taxcode-1.3.0/docs/ca/rtc_18001.md +17 -0
  31. mcp_server_taxcode-1.3.0/docs/ca/rtc_18002.md +17 -0
  32. mcp_server_taxcode-1.3.0/docs/ca/rtc_18662.md +17 -0
  33. mcp_server_taxcode-1.3.0/docs/ca/rtc_19900.md +17 -0
  34. mcp_server_taxcode-1.3.0/docs/can/ita_114.md +40 -0
  35. mcp_server_taxcode-1.3.0/docs/can/ita_115.md +194 -0
  36. mcp_server_taxcode-1.3.0/docs/can/ita_117.md +72 -0
  37. mcp_server_taxcode-1.3.0/docs/can/ita_117_1.md +101 -0
  38. mcp_server_taxcode-1.3.0/docs/can/ita_117_2019.md +60 -0
  39. mcp_server_taxcode-1.3.0/docs/can/ita_117_2023.md +72 -0
  40. mcp_server_taxcode-1.3.0/docs/can/ita_118.md +403 -0
  41. mcp_server_taxcode-1.3.0/docs/can/ita_118_2019.md +305 -0
  42. mcp_server_taxcode-1.3.0/docs/can/ita_118_2020.md +371 -0
  43. mcp_server_taxcode-1.3.0/docs/can/ita_118_2023.md +371 -0
  44. mcp_server_taxcode-1.3.0/docs/can/ita_128_1.md +503 -0
  45. mcp_server_taxcode-1.3.0/docs/can/ita_153.md +308 -0
  46. mcp_server_taxcode-1.3.0/docs/can/ita_2.md +39 -0
  47. mcp_server_taxcode-1.3.0/docs/can/ita_212.md +989 -0
  48. mcp_server_taxcode-1.3.0/docs/can/ita_250.md +194 -0
  49. mcp_server_taxcode-1.3.0/docs/can/ita_38.md +71 -0
  50. mcp_server_taxcode-1.3.0/docs/can/itr_100.md +200 -0
  51. mcp_server_taxcode-1.3.0/docs/can/itr_102.md +146 -0
  52. mcp_server_taxcode-1.3.0/docs/can/itr_103.md +172 -0
  53. mcp_server_taxcode-1.3.0/docs/can/itr_105.md +30 -0
  54. mcp_server_taxcode-1.3.0/docs/can/itr_202.md +94 -0
  55. mcp_server_taxcode-1.3.0/docs/can/itr_2600.md +36 -0
  56. mcp_server_taxcode-1.3.0/docs/can/itr_2601.md +45 -0
  57. mcp_server_taxcode-1.3.0/docs/can/itr_805.md +26 -0
  58. mcp_server_taxcode-1.3.0/docs/can/llms-full.txt +4603 -0
  59. mcp_server_taxcode-1.3.0/docs/ga/llms-full.txt +64 -0
  60. mcp_server_taxcode-1.3.0/docs/ga/ocga_48_7_20.md +17 -0
  61. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ga/ocga_48_7_20_2024.md +3 -3
  62. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ga/ocga_48_7_20_2025.md +3 -3
  63. mcp_server_taxcode-1.3.0/docs/ga/ocga_48_7_27.md +17 -0
  64. mcp_server_taxcode-1.3.0/docs/id/idaho code_63_3024.md +17 -0
  65. mcp_server_taxcode-1.3.0/docs/id/llms-full.txt +10 -0
  66. mcp_server_taxcode-1.3.0/docs/il/ilcs_5_1501_a_14.md +17 -0
  67. mcp_server_taxcode-1.3.0/docs/il/ilcs_5_1501_a_16.md +17 -0
  68. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/il/ilcs_5_1501_a_20.md +2 -2
  69. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/il/ilcs_5_201.md +2 -2
  70. mcp_server_taxcode-1.3.0/docs/il/ilcs_5_201_p.md +17 -0
  71. mcp_server_taxcode-1.3.0/docs/il/ilcs_5_202.md +17 -0
  72. mcp_server_taxcode-1.3.0/docs/il/ilcs_5_203_a.md +17 -0
  73. mcp_server_taxcode-1.3.0/docs/il/ilcs_5_204.md +17 -0
  74. mcp_server_taxcode-1.3.0/docs/il/ilcs_5_208.md +17 -0
  75. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/il/ilcs_5_301.md +2 -2
  76. mcp_server_taxcode-1.3.0/docs/il/ilcs_5_302.md +17 -0
  77. mcp_server_taxcode-1.3.0/docs/il/ilcs_5_303.md +17 -0
  78. mcp_server_taxcode-1.3.0/docs/il/ilcs_5_304_a.md +17 -0
  79. mcp_server_taxcode-1.3.0/docs/il/ilcs_5_305.md +17 -0
  80. mcp_server_taxcode-1.3.0/docs/il/ilcs_5_601_b_3.md +17 -0
  81. mcp_server_taxcode-1.3.0/docs/il/ilcs_5_701.md +17 -0
  82. mcp_server_taxcode-1.3.0/docs/il/llms-full.txt +147 -0
  83. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/llms-full.txt +8 -7
  84. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/llms.txt +124 -6
  85. mcp_server_taxcode-1.3.0/docs/ma/llms-full.txt +138 -0
  86. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ma/maconst_art__xliv.md +2 -2
  87. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ma/mgl_62_1_f.md +2 -2
  88. mcp_server_taxcode-1.3.0/docs/ma/mgl_62_2.md +17 -0
  89. mcp_server_taxcode-1.3.0/docs/ma/mgl_62_3_b_a_9.md +17 -0
  90. mcp_server_taxcode-1.3.0/docs/ma/mgl_62_3_b_a_9_2022.md +17 -0
  91. mcp_server_taxcode-1.3.0/docs/ma/mgl_62_3_b_b.md +17 -0
  92. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ma/mgl_62_4.md +2 -2
  93. mcp_server_taxcode-1.3.0/docs/ma/mgl_62_4_a.md +17 -0
  94. mcp_server_taxcode-1.3.0/docs/ma/mgl_62_5a.md +17 -0
  95. mcp_server_taxcode-1.3.0/docs/ma/mgl_62_6_a.md +17 -0
  96. mcp_server_taxcode-1.3.0/docs/ma/mgl_62_6_h.md +17 -0
  97. mcp_server_taxcode-1.3.0/docs/ma/mgl_62_6_k.md +17 -0
  98. mcp_server_taxcode-1.3.0/docs/ma/mgl_62_6_x.md +17 -0
  99. mcp_server_taxcode-1.3.0/docs/ma/mgl_62b_2.md +17 -0
  100. mcp_server_taxcode-1.3.0/docs/ma/mgl_63d_2.md +17 -0
  101. mcp_server_taxcode-1.3.0/docs/ms/llms-full.txt +10 -0
  102. mcp_server_taxcode-1.3.0/docs/ms/miss. code_27_7_5.md +17 -0
  103. mcp_server_taxcode-1.3.0/docs/ne/llms-full.txt +10 -0
  104. mcp_server_taxcode-1.3.0/docs/ne/neb. rev. stat._77_2715_03.md +17 -0
  105. mcp_server_taxcode-1.3.0/docs/nj/llms-full.txt +147 -0
  106. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nj/njac_18_35_5_2.md +2 -2
  107. mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_12_3.md +17 -0
  108. mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_12_5.md +17 -0
  109. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nj/njsa_54a_1_2.md +2 -2
  110. mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_1_2_m/342/200/223_n.md +17 -0
  111. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nj/njsa_54a_2_1.md +2 -2
  112. mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_3_1.md +17 -0
  113. mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_3a_17.md +17 -0
  114. mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_4_1.md +17 -0
  115. mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_4_1_1.md +17 -0
  116. mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_5_1.md +17 -0
  117. mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_5_2.md +17 -0
  118. mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_5_8.md +17 -0
  119. mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_5_8_2022.md +17 -0
  120. mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_7_1.md +17 -0
  121. mcp_server_taxcode-1.3.0/docs/nj/njsa_54a_9_17_e.md +17 -0
  122. mcp_server_taxcode-1.3.0/docs/nm/nmsa_7_2_7.md +17 -0
  123. mcp_server_taxcode-1.3.0/docs/ny/llms-full.txt +165 -0
  124. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ny/nycrr_105_20.md +2 -2
  125. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ny/nycrr_132_18.md +2 -2
  126. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ny/nytax_601.md +2 -2
  127. mcp_server_taxcode-1.3.0/docs/ny/nytax_601_d.md +17 -0
  128. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ny/nytax_605.md +2 -2
  129. mcp_server_taxcode-1.3.0/docs/ny/nytax_605_b_1_a.md +17 -0
  130. mcp_server_taxcode-1.3.0/docs/ny/nytax_611.md +17 -0
  131. mcp_server_taxcode-1.3.0/docs/ny/nytax_612.md +17 -0
  132. mcp_server_taxcode-1.3.0/docs/ny/nytax_614.md +17 -0
  133. mcp_server_taxcode-1.3.0/docs/ny/nytax_615.md +17 -0
  134. mcp_server_taxcode-1.3.0/docs/ny/nytax_616.md +17 -0
  135. mcp_server_taxcode-1.3.0/docs/ny/nytax_620.md +17 -0
  136. mcp_server_taxcode-1.3.0/docs/ny/nytax_631.md +17 -0
  137. mcp_server_taxcode-1.3.0/docs/ny/nytax_632.md +17 -0
  138. mcp_server_taxcode-1.3.0/docs/ny/nytax_638.md +17 -0
  139. mcp_server_taxcode-1.3.0/docs/ny/nytax_639.md +17 -0
  140. mcp_server_taxcode-1.3.0/docs/ny/nytax_671.md +17 -0
  141. mcp_server_taxcode-1.3.0/docs/ny/nytax_861.md +17 -0
  142. mcp_server_taxcode-1.3.0/docs/oh/llms-full.txt +19 -0
  143. mcp_server_taxcode-1.3.0/docs/oh/r.c._5747_02.md +17 -0
  144. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ok/68 o.s._2355.md +1 -1
  145. mcp_server_taxcode-1.3.0/docs/pr/cri_1031_02_2019.md +25 -0
  146. mcp_server_taxcode-1.3.0/docs/pr/cri_1062_01_2019.md +25 -0
  147. mcp_server_taxcode-1.3.0/docs/pr/cri_1062_03_2019.md +27 -0
  148. mcp_server_taxcode-1.3.0/docs/pr/ley60_1020_02_2019.md +48 -0
  149. mcp_server_taxcode-1.3.0/docs/pr/ley60_1020_02_2020.md +25 -0
  150. mcp_server_taxcode-1.3.0/docs/pr/ley60_2022_02_2019.md +20 -0
  151. mcp_server_taxcode-1.3.0/docs/pr/ley60_6020_03_2019.md +22 -0
  152. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_6020_10.md +4 -3
  153. mcp_server_taxcode-1.3.0/docs/pr/ley60_6020_10_2019.md +40 -0
  154. mcp_server_taxcode-1.3.0/docs/pr/ley60_6020_10_2020.md +32 -0
  155. mcp_server_taxcode-1.3.0/docs/pr/ley60_6020_10_2022.md +32 -0
  156. mcp_server_taxcode-1.1.0/docs/pr/ley60_6020_10_2019.md → mcp_server_taxcode-1.3.0/docs/pr/ley60_6020_10_2024.md +10 -8
  157. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_6020_10_2025.md +5 -4
  158. mcp_server_taxcode-1.3.0/docs/pr/ley60_6060_05.md +30 -0
  159. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/llms-full.txt +254 -12
  160. mcp_server_taxcode-1.3.0/docs/us/cfr_1_937_3_2019.md +39 -0
  161. mcp_server_taxcode-1.3.0/docs/us/irc_1_2019.md +22 -0
  162. mcp_server_taxcode-1.3.0/docs/us/irc_1_2020.md +403 -0
  163. mcp_server_taxcode-1.3.0/docs/us/irc_24_2019.md +101 -0
  164. mcp_server_taxcode-1.3.0/docs/us/irc_24_2021.md +186 -0
  165. mcp_server_taxcode-1.3.0/docs/us/irc_32_2019.md +151 -0
  166. mcp_server_taxcode-1.3.0/docs/us/irc_62_2019.md +136 -0
  167. mcp_server_taxcode-1.3.0/docs/us/irc_62_2020.md +23 -0
  168. mcp_server_taxcode-1.3.0/docs/us/irc_62_2021.md +135 -0
  169. mcp_server_taxcode-1.3.0/docs/us/irc_63_2019.md +100 -0
  170. mcp_server_taxcode-1.3.0/docs/us/irc_63_2021.md +100 -0
  171. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/llms-full.txt +1431 -123
  172. mcp_server_taxcode-1.3.0/docs/ut/llms-full.txt +10 -0
  173. mcp_server_taxcode-1.3.0/docs/ut/utah code_59_10_104.md +17 -0
  174. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/wa/llms-full.txt +2 -2
  175. mcp_server_taxcode-1.3.0/docs/wa/rcw_82_87_040.md +17 -0
  176. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/fastmcp.json +1 -1
  177. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/pyproject.toml +16 -7
  178. mcp_server_taxcode-1.3.0/scripts/build_corrected_pins.py +73 -0
  179. mcp_server_taxcode-1.3.0/scripts/build_prior_years_pins.py +255 -0
  180. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/scripts/check_tool_contract.py +35 -8
  181. mcp_server_taxcode-1.3.0/scripts/extract_canada_lims.py +113 -0
  182. mcp_server_taxcode-1.3.0/scripts/gen_build_backend.py +195 -0
  183. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/scripts/ingest_statutes.py +9 -1
  184. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/scripts/setup_repo_governance.sh +2 -3
  185. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/skills/taxcode-mcp/SKILL.md +2 -2
  186. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/catalog.py +693 -45
  187. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/federal/standard_deduction.json +48 -0
  188. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/jurisdictions.json +2 -1
  189. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/ak.json +5 -5
  190. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/al.json +98 -0
  191. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ar.json +62 -0
  192. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/az.json +2 -1
  193. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ca.json +321 -0
  194. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/can.json +783 -0
  195. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/co.json +31 -1
  196. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/ct.json +5 -5
  197. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/dc.json +1 -1
  198. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/de.json +1 -1
  199. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ga.json +302 -0
  200. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/hi.json +58 -0
  201. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/ia.json +14 -1
  202. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/id.json +70 -0
  203. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/il.json +249 -0
  204. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/in.json +1 -1
  205. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ks.json +243 -0
  206. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/ky.json +35 -4
  207. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/la.json +16 -1
  208. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ma.json +256 -0
  209. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/md.json +35 -5
  210. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/me.json +4 -3
  211. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/mi.json +4 -3
  212. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/mn.json +2 -1
  213. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/mo.json +2 -1
  214. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ms.json +175 -0
  215. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/mt.json +2 -1
  216. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/nc.json +87 -0
  217. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/nd.json +1 -1
  218. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ne.json +139 -0
  219. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/nh.json +57 -0
  220. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/nj.json +227 -0
  221. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/nm.json +88 -0
  222. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/nv.json +33 -0
  223. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ny.json +253 -0
  224. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/oh.json +131 -0
  225. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/ok.json +20 -4
  226. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/or.json +1 -1
  227. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/pa.json +1 -1
  228. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/pr.json +149 -6
  229. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ri.json +96 -0
  230. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/sc.json +48 -0
  231. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/sd.json +33 -0
  232. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/tn.json +6 -6
  233. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/us.json +246 -0
  234. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/ut.json +166 -0
  235. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/va.json +139 -0
  236. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/vt.json +4 -3
  237. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/wa.json +33 -0
  238. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/manifest/wi.json +69 -0
  239. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/wv.json +15 -1
  240. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/wy.json +6 -5
  241. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/publications/can.json +51 -0
  242. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/publications/ga.json +15 -0
  243. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/ak.json +1 -1
  244. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/al.json +54 -0
  245. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/ar.json +107 -0
  246. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/az.json +1 -4
  247. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/ca.json +188 -0
  248. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/can.json +272 -0
  249. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/co.json +21 -4
  250. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/ct.json +742 -0
  251. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/dc.json +2 -2
  252. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/ga.json +177 -0
  253. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/hi.json +105 -0
  254. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/ia.json +2 -2
  255. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/id.json +25 -2
  256. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/ks.json +100 -0
  257. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/ky.json +8 -1
  258. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/ma.json +8 -0
  259. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/md.json +232 -0
  260. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/me.json +2 -2
  261. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/mo.json +2 -2
  262. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/ms.json +177 -0
  263. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/mt.json +2 -2
  264. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/nc.json +17 -2
  265. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/nd.json +2 -2
  266. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/ne.json +214 -0
  267. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/nh.json +17 -0
  268. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/nj.json +33 -5
  269. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/nm.json +157 -0
  270. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/nv.json +1 -1
  271. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/ny.json +41 -9
  272. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/oh.json +172 -0
  273. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/ok.json +40 -1
  274. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/ri.json +108 -0
  275. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/sc.json +25 -2
  276. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/sd.json +1 -1
  277. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/tn.json +1 -1
  278. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/rates/ut.json +33 -0
  279. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/va.json +30 -2
  280. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/wa.json +6 -1
  281. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/wi.json +40 -0
  282. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/wv.json +48 -1
  283. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/wy.json +1 -1
  284. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/statutes/ca.json +435 -0
  285. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/statutes/can.json +4953 -0
  286. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ga.json +11 -11
  287. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/id.json +2 -2
  288. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/statutes/il.json +372 -0
  289. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/statutes/ma.json +343 -0
  290. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ms.json +2 -2
  291. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/statutes/ne.json +26 -0
  292. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/statutes/nj.json +369 -0
  293. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/nm.json +1 -1
  294. mcp_server_taxcode-1.3.0/src/taxcode_mcp/data/statutes/ny.json +419 -0
  295. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/oh.json +2 -2
  296. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ok.json +1 -1
  297. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/pr.json +411 -17
  298. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/us.json +1845 -382
  299. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ut.json +2 -2
  300. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/wa.json +2 -2
  301. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/db.py +226 -22
  302. mcp_server_taxcode-1.3.0/src/taxcode_mcp/disclaimers.py +166 -0
  303. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/paging.py +11 -7
  304. mcp_server_taxcode-1.3.0/src/taxcode_mcp/tools/canada.py +452 -0
  305. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/tools/compliance.py +749 -126
  306. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/tools/statutes.py +38 -8
  307. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/tools/system.py +1 -1
  308. mcp_server_taxcode-1.3.0/tests/fixtures/compliance_golden/compliance_evaluate_georgia_residency.jsonl.gz +0 -0
  309. mcp_server_taxcode-1.3.0/tests/fixtures/compliance_golden/compliance_evaluate_state_residency.jsonl.gz +0 -0
  310. mcp_server_taxcode-1.3.0/tests/fixtures/prior_years/corrected_answers.json +367 -0
  311. mcp_server_taxcode-1.3.0/tests/fixtures/prior_years/f4f0d5d_pins.json.gz +0 -0
  312. mcp_server_taxcode-1.3.0/tests/fixtures/wave1/existing_rows.json +19 -0
  313. mcp_server_taxcode-1.3.0/tests/fixtures/wave1/searches.json +953 -0
  314. mcp_server_taxcode-1.3.0/tests/fixtures/wave1/sources.json +337 -0
  315. mcp_server_taxcode-1.3.0/tests/test_al_md_ca_data_fixes.py +105 -0
  316. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_batch.py +39 -0
  317. mcp_server_taxcode-1.3.0/tests/test_build_backend_lock.py +145 -0
  318. mcp_server_taxcode-1.3.0/tests/test_canada_federal.py +908 -0
  319. mcp_server_taxcode-1.3.0/tests/test_catalog.py +1092 -0
  320. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_code_mode_extra.py +1 -5
  321. mcp_server_taxcode-1.3.0/tests/test_ct_md_edges.py +107 -0
  322. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_db.py +66 -19
  323. mcp_server_taxcode-1.3.0/tests/test_dependents_spouse_inputs.py +133 -0
  324. mcp_server_taxcode-1.3.0/tests/test_dockerfile.py +280 -0
  325. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_e2e_live.py +2 -1
  326. mcp_server_taxcode-1.3.0/tests/test_fastmcp_json_floor.py +75 -0
  327. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_ingest.py +114 -14
  328. mcp_server_taxcode-1.3.0/tests/test_notfound_pointer.py +205 -0
  329. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_paging.py +19 -8
  330. mcp_server_taxcode-1.3.0/tests/test_prior_years.py +619 -0
  331. mcp_server_taxcode-1.3.0/tests/test_prior_years_pin.py +684 -0
  332. mcp_server_taxcode-1.3.0/tests/test_prior_years_pr.py +616 -0
  333. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_protocol.py +13 -0
  334. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_rate_prose.py +5 -11
  335. mcp_server_taxcode-1.3.0/tests/test_rate_tables.py +1451 -0
  336. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_search_normalize.py +8 -1
  337. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_search_snippets.py +30 -19
  338. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_server.py +121 -64
  339. mcp_server_taxcode-1.3.0/tests/test_statute_section_slash.py +62 -0
  340. mcp_server_taxcode-1.3.0/tests/test_undated_current_rows.py +68 -0
  341. mcp_server_taxcode-1.3.0/tests/test_wave1_state_statutes.py +201 -0
  342. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/uv.lock +481 -747
  343. mcp_server_taxcode-1.1.0/.github/dependabot.yml +0 -36
  344. mcp_server_taxcode-1.1.0/.github/workflows/drift-monitor.yml +0 -47
  345. mcp_server_taxcode-1.1.0/docs/ca/llms-full.txt +0 -37
  346. mcp_server_taxcode-1.1.0/docs/ca/rtc_17041.md +0 -17
  347. mcp_server_taxcode-1.1.0/docs/ga/llms-full.txt +0 -64
  348. mcp_server_taxcode-1.1.0/docs/ga/ocga_48_7_20.md +0 -17
  349. mcp_server_taxcode-1.1.0/docs/ga/ocga_48_7_27.md +0 -17
  350. mcp_server_taxcode-1.1.0/docs/id/idaho code_63_3024.md +0 -17
  351. mcp_server_taxcode-1.1.0/docs/id/llms-full.txt +0 -10
  352. mcp_server_taxcode-1.1.0/docs/il/llms-full.txt +0 -28
  353. mcp_server_taxcode-1.1.0/docs/ma/llms-full.txt +0 -28
  354. mcp_server_taxcode-1.1.0/docs/ms/llms-full.txt +0 -10
  355. mcp_server_taxcode-1.1.0/docs/ms/miss. code_27_7_5.md +0 -17
  356. mcp_server_taxcode-1.1.0/docs/ne/llms-full.txt +0 -10
  357. mcp_server_taxcode-1.1.0/docs/ne/neb. rev. stat._77_2715_03.md +0 -17
  358. mcp_server_taxcode-1.1.0/docs/nj/llms-full.txt +0 -28
  359. mcp_server_taxcode-1.1.0/docs/nm/nmsa_7_2_7.md +0 -17
  360. mcp_server_taxcode-1.1.0/docs/ny/llms-full.txt +0 -37
  361. mcp_server_taxcode-1.1.0/docs/oh/llms-full.txt +0 -19
  362. mcp_server_taxcode-1.1.0/docs/oh/r.c._5747_02.md +0 -17
  363. mcp_server_taxcode-1.1.0/docs/ut/llms-full.txt +0 -10
  364. mcp_server_taxcode-1.1.0/docs/ut/utah code_59_10_104.md +0 -17
  365. mcp_server_taxcode-1.1.0/docs/wa/rcw_82_87_040.md +0 -17
  366. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/al.json +0 -32
  367. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ar.json +0 -32
  368. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ca.json +0 -71
  369. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ga.json +0 -136
  370. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/hi.json +0 -32
  371. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/id.json +0 -32
  372. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/il.json +0 -58
  373. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ks.json +0 -32
  374. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ma.json +0 -70
  375. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ms.json +0 -32
  376. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/nc.json +0 -45
  377. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ne.json +0 -45
  378. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/nh.json +0 -32
  379. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/nj.json +0 -58
  380. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/nm.json +0 -32
  381. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/nv.json +0 -32
  382. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ny.json +0 -71
  383. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/oh.json +0 -58
  384. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ri.json +0 -45
  385. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/sc.json +0 -32
  386. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/sd.json +0 -32
  387. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/ut.json +0 -32
  388. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/va.json +0 -71
  389. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/manifest/wi.json +0 -32
  390. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/publications/ga.json +0 -24
  391. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/al.json +0 -44
  392. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/ar.json +0 -18
  393. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/ca.json +0 -50
  394. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/ct.json +0 -50
  395. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/ga.json +0 -39
  396. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/ks.json +0 -36
  397. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/md.json +0 -49
  398. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/ms.json +0 -36
  399. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/ne.json +0 -54
  400. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/nh.json +0 -12
  401. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/nm.json +0 -63
  402. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/oh.json +0 -48
  403. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/ri.json +0 -46
  404. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/rates/ut.json +0 -19
  405. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/statutes/ca.json +0 -96
  406. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/statutes/il.json +0 -73
  407. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/statutes/ma.json +0 -73
  408. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/statutes/ne.json +0 -26
  409. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/statutes/nj.json +0 -73
  410. mcp_server_taxcode-1.1.0/src/taxcode_mcp/data/statutes/ny.json +0 -95
  411. mcp_server_taxcode-1.1.0/src/taxcode_mcp/disclaimers.py +0 -90
  412. mcp_server_taxcode-1.1.0/tests/fixtures/compliance_golden/compliance_evaluate_georgia_residency.jsonl.gz +0 -0
  413. mcp_server_taxcode-1.1.0/tests/fixtures/compliance_golden/compliance_evaluate_state_residency.jsonl.gz +0 -0
  414. mcp_server_taxcode-1.1.0/tests/test_catalog.py +0 -555
  415. mcp_server_taxcode-1.1.0/tests/test_dockerfile.py +0 -141
  416. mcp_server_taxcode-1.1.0/tests/test_rate_tables.py +0 -586
  417. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/.github/workflows/dependabot-automerge.yml +0 -0
  418. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/.gitignore +0 -0
  419. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/CHANGELOG.md +0 -0
  420. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/CODE_OF_CONDUCT.md +0 -0
  421. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/LICENSE +0 -0
  422. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/SECURITY.md +0 -0
  423. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ak/alaska stat._43_05_080.md +0 -0
  424. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ak/llms-full.txt +0 -0
  425. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/al/ala. code_40_18_2.md +0 -0
  426. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/al/llms-full.txt +0 -0
  427. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ar/a.c.a._26_51_201.md +0 -0
  428. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ar/llms-full.txt +0 -0
  429. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/az/a.r.s._43_1011.md +0 -0
  430. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/az/a.r.s._43_104.md +0 -0
  431. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/az/llms-full.txt +0 -0
  432. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/co/c.r.s._39_22_103.md +0 -0
  433. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/co/c.r.s._39_22_104.md +0 -0
  434. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/co/llms-full.txt +0 -0
  435. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ct/c.g.s._12_700.md +0 -0
  436. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ct/c.g.s._12_701.md +0 -0
  437. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ct/c.g.s._12_711.md +0 -0
  438. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ct/llms-full.txt +0 -0
  439. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/dc/d.c. code_47_1806_03.md +0 -0
  440. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/dc/llms-full.txt +0 -0
  441. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/de/del. code_1102.md +0 -0
  442. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/de/llms-full.txt +0 -0
  443. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/fl/flconst_art__vii_sec__5.md +0 -0
  444. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/fl/flstat_196_031.md +0 -0
  445. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/fl/flstat_222_17.md +0 -0
  446. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/fl/llms-full.txt +0 -0
  447. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ga/gareg_560_7_3__01.md +0 -0
  448. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ga/ocga_48_7_1.md +0 -0
  449. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ga/ocga_48_7_30.md +0 -0
  450. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/hi/hrs_235_51.md +0 -0
  451. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/hi/llms-full.txt +0 -0
  452. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ia/iowa code_422_5.md +0 -0
  453. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ia/llms-full.txt +0 -0
  454. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/in/ind. code_6_3_2_1.md +0 -0
  455. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/in/llms-full.txt +0 -0
  456. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ks/k.s.a._79_32,110.md +0 -0
  457. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ks/llms-full.txt +0 -0
  458. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ky/krs_141_020.md +0 -0
  459. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ky/llms-full.txt +0 -0
  460. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/la/la. r.s._47_32.md +0 -0
  461. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/la/la. r.s._47_32_2022.md +0 -0
  462. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/la/llms-full.txt +0 -0
  463. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/md/llms-full.txt +0 -0
  464. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/md/md. code_10_101.md +0 -0
  465. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/md/md. code_10_105.md +0 -0
  466. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/md/md. code_10_106.md +0 -0
  467. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/me/36 m.r.s._5111.md +0 -0
  468. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/me/llms-full.txt +0 -0
  469. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/mi/llms-full.txt +0 -0
  470. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/mi/mcl_206_51.md +0 -0
  471. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/mn/llms-full.txt +0 -0
  472. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/mn/minn. stat._290_06.md +0 -0
  473. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/mo/llms-full.txt +0 -0
  474. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/mo/rsmo_143_011.md +0 -0
  475. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/mt/llms-full.txt +0 -0
  476. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/mt/mca_15_30_2103.md +0 -0
  477. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nc/llms-full.txt +0 -0
  478. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nc/n.c.g.s._105_153_3.md +0 -0
  479. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nc/n.c.g.s._105_153_7.md +0 -0
  480. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nd/llms-full.txt +0 -0
  481. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nd/n.d.c.c._57_38_30_3.md +0 -0
  482. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nh/llms-full.txt +0 -0
  483. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nh/rsa_77_1_2024.md +0 -0
  484. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nm/llms-full.txt +0 -0
  485. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nv/llms-full.txt +0 -0
  486. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/nv/nev. const._art__10,_/302/247_1.md" +0 -0
  487. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/oh/r.c._5747_24.md +0 -0
  488. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ok/llms-full.txt +0 -0
  489. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/or/llms-full.txt +0 -0
  490. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/or/ors_316_037.md +0 -0
  491. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pa/llms-full.txt +0 -0
  492. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pa/p.s._7301.md +0 -0
  493. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pa/p.s._7302.md +0 -0
  494. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pa/pa. code_109_8.md +0 -0
  495. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/cri_1010_01.md +0 -0
  496. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/cri_1031_01.md +0 -0
  497. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/cri_1031_02.md +0 -0
  498. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/cri_1062_01.md +0 -0
  499. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/cri_1062_03.md +0 -0
  500. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley22_3_2012.md +0 -0
  501. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_1020_02.md +0 -0
  502. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_2021_01.md +0 -0
  503. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_2022_01.md +0 -0
  504. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_2022_01_2019.md +0 -0
  505. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_2022_02.md +0 -0
  506. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_2031_01.md +0 -0
  507. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_2032_01.md +0 -0
  508. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_6020_03.md +0 -0
  509. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/pr/ley60_6070_55.md +0 -0
  510. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ri/llms-full.txt +0 -0
  511. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/ri/r.i.g.l._44_30_1.md +0 -0
  512. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/sc/llms-full.txt +0 -0
  513. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/sc/s.c. code_12_6_510.md +0 -0
  514. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/sd/llms-full.txt +0 -0
  515. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/sd/s.d. const._art__xi,_/302/247_2.md" +0 -0
  516. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/tn/llms-full.txt +0 -0
  517. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/tn/tenn. const._art__ii,_/302/247_28.md" +0 -0
  518. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/tx/llms-full.txt +0 -0
  519. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/tx/txconst_art__viii_sec__24_a.md +0 -0
  520. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/tx/txtax_171_001.md +0 -0
  521. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/cfr_1_937_1.md +0 -0
  522. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/cfr_1_937_2.md +0 -0
  523. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/cfr_1_937_3.md +0 -0
  524. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_1.md +0 -0
  525. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_1411.md +0 -0
  526. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_24.md +0 -0
  527. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_32.md +0 -0
  528. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_6012.md +0 -0
  529. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_61.md +0 -0
  530. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_62.md +0 -0
  531. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_63.md +0 -0
  532. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_6688.md +0 -0
  533. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_865.md +0 -0
  534. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_911.md +0 -0
  535. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_933.md +0 -0
  536. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_937.md +0 -0
  537. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/us/irc_957.md +0 -0
  538. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/va/llms-full.txt +0 -0
  539. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/va/va. code_58_1_302.md +0 -0
  540. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/va/va. code_58_1_320.md +0 -0
  541. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/va/va. code_58_1_342.md +0 -0
  542. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/vt/32 v.s.a._5822.md +0 -0
  543. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/vt/llms-full.txt +0 -0
  544. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/wa/rcw_82_87_020.md +0 -0
  545. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/wa/waconst_art__vii_sec__1.md +0 -0
  546. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/wi/llms-full.txt +0 -0
  547. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/wi/wis. stat._71_06.md +0 -0
  548. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/wv/llms-full.txt +0 -0
  549. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/wv/w. va. code_11_21_4e.md +0 -0
  550. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/wy/llms-full.txt +0 -0
  551. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/docs/wy/wyo. const._art__15,_/302/247_18.md" +0 -0
  552. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/scripts/build_catalog.py +0 -0
  553. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/scripts/check_conformance.sh +0 -0
  554. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/scripts/check_openapi_drift.py +0 -0
  555. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/scripts/check_version.py +0 -0
  556. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/scripts/release_notes.py +0 -0
  557. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/server.json +0 -0
  558. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/__init__.py +0 -0
  559. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/auth.py +0 -0
  560. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/client.py +0 -0
  561. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/config.py +0 -0
  562. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/fl.json +0 -0
  563. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/manifest/tx.json +0 -0
  564. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/publications/md.json +0 -0
  565. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/publications/oh.json +0 -0
  566. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/publications/pa.json +0 -0
  567. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/publications/pr.json +0 -0
  568. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/publications/us.json +0 -0
  569. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/publications/va.json +0 -0
  570. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/de.json +0 -0
  571. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/il.json +0 -0
  572. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/in.json +0 -0
  573. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/la.json +0 -0
  574. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/mi.json +0 -0
  575. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/mn.json +0 -0
  576. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/or.json +0 -0
  577. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/pa.json +0 -0
  578. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/rates/vt.json +0 -0
  579. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ak.json +0 -0
  580. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/al.json +0 -0
  581. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ar.json +0 -0
  582. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/az.json +0 -0
  583. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/co.json +0 -0
  584. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ct.json +0 -0
  585. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/dc.json +0 -0
  586. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/de.json +0 -0
  587. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/fl.json +0 -0
  588. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/hi.json +0 -0
  589. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ia.json +0 -0
  590. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/in.json +0 -0
  591. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ks.json +0 -0
  592. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ky.json +0 -0
  593. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/la.json +0 -0
  594. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/md.json +0 -0
  595. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/me.json +0 -0
  596. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/mi.json +0 -0
  597. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/mn.json +0 -0
  598. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/mo.json +0 -0
  599. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/mt.json +0 -0
  600. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/nc.json +0 -0
  601. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/nd.json +0 -0
  602. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/nh.json +0 -0
  603. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/nv.json +0 -0
  604. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/or.json +0 -0
  605. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/pa.json +0 -0
  606. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/ri.json +0 -0
  607. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/sc.json +0 -0
  608. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/sd.json +0 -0
  609. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/tn.json +0 -0
  610. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/tx.json +0 -0
  611. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/va.json +0 -0
  612. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/vt.json +0 -0
  613. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/wi.json +0 -0
  614. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/wv.json +0 -0
  615. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/data/statutes/wy.json +0 -0
  616. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/errors.py +0 -0
  617. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/middleware.py +0 -0
  618. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/profiles.py +0 -0
  619. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/server.py +0 -0
  620. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/ssrf.py +0 -0
  621. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/src/taxcode_mcp/tools/__init__.py +0 -0
  622. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/conftest.py +0 -0
  623. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/fake_network.py +0 -0
  624. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/fixtures/compliance_golden/compliance_calculate_built_in_gain_sourcing.jsonl.gz +0 -0
  625. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/fixtures/compliance_golden/compliance_cross_border_tax_analysis.jsonl.gz +0 -0
  626. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/fixtures/compliance_golden/compliance_evaluate_pr_bona_fide_residency.jsonl.gz +0 -0
  627. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/fixtures/compliance_golden/constants.json +0 -0
  628. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/fixtures/usc26_sample.xml +0 -0
  629. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/golden_compliance.py +0 -0
  630. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_check_version.py +0 -0
  631. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_client.py +0 -0
  632. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_compliance_golden.py +0 -0
  633. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_config.py +0 -0
  634. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_conftest_auth_env.py +0 -0
  635. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_disclaimers.py +0 -0
  636. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_drift.py +0 -0
  637. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_errors.py +0 -0
  638. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_federal.py +0 -0
  639. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_http_auth.py +0 -0
  640. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_layered.py +0 -0
  641. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_network_guard.py +0 -0
  642. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_otel_spans.py +0 -0
  643. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_profiles.py +0 -0
  644. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_release_notes.py +0 -0
  645. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_ssrf.py +0 -0
  646. {mcp_server_taxcode-1.1.0 → mcp_server_taxcode-1.3.0}/tests/test_version.py +0 -0
@@ -0,0 +1 @@
1
+ * @christianclaudio
@@ -0,0 +1,58 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "uv"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ day: "sunday"
8
+ time: "09:30"
9
+ timezone: "America/New_York"
10
+ open-pull-requests-limit: 10
11
+ groups:
12
+ dependencies:
13
+ patterns:
14
+ - "*"
15
+ python-security:
16
+ applies-to: "security-updates"
17
+ patterns:
18
+ - "*"
19
+ update-types:
20
+ - "minor"
21
+ - "patch"
22
+
23
+ - package-ecosystem: "github-actions"
24
+ directory: "/"
25
+ schedule:
26
+ interval: "weekly"
27
+ day: "sunday"
28
+ time: "09:30"
29
+ timezone: "America/New_York"
30
+ open-pull-requests-limit: 10
31
+ groups:
32
+ actions:
33
+ patterns:
34
+ - "*"
35
+ actions-security:
36
+ applies-to: "security-updates"
37
+ patterns:
38
+ - "*"
39
+ update-types:
40
+ - "minor"
41
+ - "patch"
42
+
43
+ - package-ecosystem: "docker"
44
+ directory: "/"
45
+ schedule:
46
+ interval: "weekly"
47
+ day: "sunday"
48
+ time: "09:30"
49
+ timezone: "America/New_York"
50
+ open-pull-requests-limit: 10
51
+ groups:
52
+ docker-security:
53
+ applies-to: "security-updates"
54
+ patterns:
55
+ - "*"
56
+ update-types:
57
+ - "minor"
58
+ - "patch"
@@ -7,10 +7,15 @@ on:
7
7
  branches: [main]
8
8
  # Merges made by dependabot-automerge.yml use GITHUB_TOKEN, and pushes made
9
9
  # with GITHUB_TOKEN don't trigger push workflows, so the push trigger above
10
- # misses them. The 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@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
39
44
  with:
40
45
  # Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
41
46
  # FastMCP's October 2026 certificate authority incident notice).
@@ -43,12 +48,12 @@ jobs:
43
48
  enable-cache: true
44
49
 
45
50
  - name: Set up Python
46
- uses: actions/setup-python@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@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
77
82
  with:
78
83
  # Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
79
84
  # FastMCP's October 2026 certificate authority incident notice).
@@ -81,7 +86,7 @@ jobs:
81
86
  enable-cache: true
82
87
 
83
88
  - name: Set up Python ${{ matrix.python-version }}
84
- uses: actions/setup-python@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@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
109
114
  with:
110
115
  # Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
111
116
  # FastMCP's October 2026 certificate authority incident notice).
@@ -113,12 +118,12 @@ jobs:
113
118
  enable-cache: true
114
119
 
115
120
  - name: Set up Python
116
- uses: actions/setup-python@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@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
153
158
  with:
154
159
  # Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
155
160
  # FastMCP's October 2026 certificate authority incident notice).
156
161
  version-file: "pyproject.toml"
157
162
 
158
163
  - name: Set up Python
159
- uses: actions/setup-python@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
@@ -198,6 +203,59 @@ jobs:
198
203
  fi
199
204
  echo "Image label matches ${EXPECTED}"
200
205
 
206
+ - name: Runtime image has the project and no build backend
207
+ # The builder installs the build backend to /tmp/build-backend, outside the venv the
208
+ # runtime stage copies, so no build-only package from docker/build-backend.txt may be
209
+ # in the image. packaging is left out on purpose: fastmcp-slim needs it at runtime
210
+ # (uv.lock).
211
+ run: |
212
+ PROJECT="$(grep -m 1 '^name = ' pyproject.toml | cut -d '"' -f 2)"
213
+ docker run --rm --entrypoint pip mcp-server-ci:test show "$PROJECT" > /dev/null
214
+ for pkg in hatchling uv-dynamic-versioning dunamai trove-classifiers tomlkit jinja2 \
215
+ MarkupSafe pathspec pluggy; do
216
+ if docker run --rm --entrypoint pip mcp-server-ci:test show "$pkg" > /dev/null 2>&1; then
217
+ echo "::error::build backend package $pkg is in the runtime image"
218
+ exit 1
219
+ fi
220
+ done
221
+ echo "Runtime image has $PROJECT and no build backend"
222
+
223
+ - name: Image serves MCP over stdio
224
+ # Starts the runtime image on its default stdio transport with no network, sends
225
+ # initialize, notifications/initialized and tools/list, and holds stdin open until
226
+ # the tools/list reply arrives so the check does not depend on shutdown-on-EOF timing.
227
+ # Replies are matched by JSON-RPC id, not by line order, and every non-empty stdout line
228
+ # must parse as exactly one JSON-RPC 2.0 message (stdio is newline-delimited).
229
+ run: |
230
+ set -euo pipefail
231
+ IN="$RUNNER_TEMP/mcp-in"
232
+ OUT="$RUNNER_TEMP/mcp-out"
233
+ mkfifo "$IN"
234
+ : > "$OUT"
235
+ timeout --kill-after=5 60 docker run -i --rm --network none mcp-server-ci:test < "$IN" > "$OUT" &
236
+ SERVER=$!
237
+ exec 3> "$IN"
238
+ MESSAGES='split("\n") | map(select(length > 0) | fromjson | if type == "object" and .jsonrpc == "2.0" then . else error("stdout line is not a JSON-RPC 2.0 message") end)'
239
+ wait_for_id() {
240
+ for _ in $(seq 1 150); do
241
+ if jq -Rse --argjson id "$1" "$MESSAGES | any(.[]; .id == \$id)" "$OUT" > /dev/null 2>&1; then
242
+ return 0
243
+ fi
244
+ sleep 0.2
245
+ done
246
+ echo "No reply with id $1 within 30s"; cat "$OUT"; exit 1
247
+ }
248
+ printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"ci-smoke","version":"0"}}}' >&3
249
+ wait_for_id 1
250
+ printf '%s\n' '{"jsonrpc":"2.0","method":"notifications/initialized"}' >&3
251
+ printf '%s\n' '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' >&3
252
+ wait_for_id 2
253
+ exec 3>&-
254
+ wait "$SERVER"
255
+ jq -Rse "$MESSAGES"' | map(select(.id == 1)) | length == 1 and .[0].result.protocolVersion == "2025-11-25"' "$OUT"
256
+ jq -Rse "$MESSAGES"' | map(select(.id == 2)) | length == 1 and (.[0].result.tools | type == "array" and length > 0)' "$OUT"
257
+ echo "Image answered initialize and tools/list over stdio"
258
+
201
259
  - name: Builder fails below the ca-certificates floor
202
260
  # Raising CA_CERTIFICATES_FLOOR above any real Debian version makes the installed
203
261
  # package older than the floor, whatever version the base image or trixie-security
@@ -223,3 +281,35 @@ jobs:
223
281
  exit 1
224
282
  fi
225
283
  echo "Builder stops at the ca-certificates floor check before any pip step"
284
+
285
+ drift-check:
286
+ name: Check API Drift
287
+ # Scheduled and manual runs only; pushes and pull requests skip it.
288
+ if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
289
+ permissions:
290
+ contents: read
291
+ runs-on: ubuntu-latest
292
+ steps:
293
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
294
+ with:
295
+ fetch-depth: 0
296
+ persist-credentials: false
297
+
298
+ - name: Install uv
299
+ uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
300
+ with:
301
+ # Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
302
+ # FastMCP's October 2026 certificate authority incident notice).
303
+ version-file: "pyproject.toml"
304
+ enable-cache: true
305
+
306
+ - name: Set up Python
307
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
308
+ with:
309
+ python-version: "3.11"
310
+
311
+ - name: Install dependencies
312
+ run: uv sync --locked --extra dev --python 3.11
313
+
314
+ - name: Run OpenAPI drift detection
315
+ run: uv run python scripts/check_openapi_drift.py
@@ -26,7 +26,7 @@ jobs:
26
26
  persist-credentials: false
27
27
 
28
28
  - name: Install uv
29
- uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
29
+ uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
30
30
  with:
31
31
  # Newest uv that meets pyproject.toml's [tool.uv] required-version (>=0.13.4, from
32
32
  # FastMCP's October 2026 certificate authority incident notice).
@@ -34,9 +34,9 @@ jobs:
34
34
  enable-cache: false
35
35
 
36
36
  - name: Set up Python
37
- uses: actions/setup-python@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,10 +94,10 @@ jobs:
94
94
  name: dist
95
95
 
96
96
  - name: Publish to PyPI via OIDC
97
- uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
97
+ uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3
98
98
 
99
99
  - name: Create GitHub Release
100
- uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3.0.3
100
+ uses: softprops/action-gh-release@8a0cd651e5b2365bd640854a3fa5dfc70e4875f3 # v3.0.4
101
101
  with:
102
102
  files: |
103
103
  dist/*.whl
@@ -122,7 +122,7 @@ jobs:
122
122
  persist-credentials: false
123
123
 
124
124
  - name: Log in to GitHub Container Registry
125
- uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
125
+ uses: docker/login-action@8aa5831fb8d48d8f76594c7ddde61ae58019f550 # v4.8.0
126
126
  with:
127
127
  registry: ghcr.io
128
128
  username: ${{ github.actor }}
@@ -46,11 +46,11 @@ Host configuration JSON for these doc servers (`mcp_config.json` and other deskt
46
46
  - `src/<name>_mcp/client.py` — async HTTP client; `ssrf.py` — SSRF / DNS-rebinding guard; `errors.py` — exceptions and secret redaction; `middleware.py` — parent and child middleware; `config.py` — settings.
47
47
  - `src/taxcode_mcp/data/` — the single source of truth for statute and publication rows: `jurisdictions.json` (catalog order), `statutes/<code>.json`, `publications/<code>.json`, `manifest/<code>.json` (one source record per row), and `rates/<code>.json` (the compliance tools' rate tables, one per state in `RATE_TABLE_MODELS`). `src/taxcode_mcp/catalog.py` loads and validates them; `db.py` seeds DuckDB from the rows, and `tools/compliance.py` reads every rate from the rate tables. Row layout, manifest fields and how to add a row: `CONTRIBUTING.md` (Adding or changing a row).
48
48
  - `scripts/build_catalog.py` — rewrites the data files in canonical form and generates `docs/<code>/*.md`, `docs/<code>/llms-full.txt` (one jurisdiction's full text), `docs/llms.txt` and `docs/llms-full.txt` (the index of the per-jurisdiction files) from them; `--check` (run in CI and by `tests/test_catalog.py`) fails on a schema or canonical-form error (rate tables included, and a missing or stray rate table), an incomplete or mismatched manifest entry, or docs that differ from the generated output. Never edit generated docs by hand.
49
- - `src/taxcode_mcp/paging.py` — hard response cap (32,000 characters of JSON) and paging for the statutes tools: `statutes_lookup_statute` pages long text (`page_cursor` / `next_cursor`), search and publications clamp `limit` to 1..25 items per call (`offset` / `next_offset`), and the `taxcode://statutes/{jurisdiction}/{section}{?page_cursor}` resource returns the same 8,000-character pages, ending a non-final page with the full URI of the next one (`...?page_cursor=`). The template has no `statutes/` segment of its own: the `statutes` mount namespace supplies it.
49
+ - `src/taxcode_mcp/paging.py` — hard response cap (32,000 characters of JSON) and paging for the statutes tools: `statutes_lookup_statute` pages long text (`page_cursor` / `next_cursor`), search and publications clamp `limit` to 1..25 items per call (`offset` / `next_offset`), and the `taxcode://statutes/{jurisdiction}/{section*}{?page_cursor}` resource returns the same 8,000-character pages, ending a non-final page with the full URI of the next one (`...?page_cursor=`). The template has no `statutes/` segment of its own: the `statutes` mount namespace supplies it.
50
50
  - `scripts/check_tool_contract.py` — source of truth for the expected tool set and annotations. Do not hard-code tool counts elsewhere.
51
51
  - `scripts/check_openapi_drift.py`, `scripts/check_conformance.sh` + `conformance-baseline.yml` — drift and protocol conformance.
52
52
  - `tests/` — offline unit, layered-composition, and protocol tests; `test_e2e_live.py` is opt-in (`-m e2e`).
53
- - `.github/workflows/` — `ci.yml`, `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 build backend from `docker/build-backend.txt` (hash-pinned hatchling, uv-dynamic-versioning, and every transitive build dependency, `--require-hashes --only-binary=:all:`, into `/tmp/build-backend` outside the venv, so the runtime image has no build backend) and the project with `PYTHONPATH=/tmp/build-backend pip install --no-deps --no-build-isolation .`. Never install the project with its dependencies (`pip install .`), which resolves them fresh at build time. Dependabot's weekly `uv` updates bump the uv pin and rewrite its sha256 values, writing one for every wheel and the sdist published for that version. Whoever changes `[tool.uv] required-version` keeps the uv pin within it, and a hand bump takes a sha256 for every wheel and the sdist from `https://pypi.org/pypi/uv/<version>/json` (`digests.sha256`); the manylinux x86_64 and aarch64 wheels are the ones the image build installs. The build-backend pins are the `build-backend` dependency group in `pyproject.toml` (exact versions inside the `[build-system]` ranges, not installed by default), so `uv.lock` carries their closure with hashes. After `uv lock`, `uv run python scripts/gen_build_backend.py` rewrites `docker/build-backend.txt` from `uv.lock` (`--check` reports drift instead), and `tests/test_build_backend_lock.py` fails if the file, the lock or the ranges disagree. Dependabot does not track that file (no `pip` ecosystem entry covers `docker/` in `.github/dependabot.yml`). `tests/test_dockerfile.py` enforces the install steps and the pins.
145
146
  - Lowering `CA_CERTIFICATES_FLOOR` with `--build-arg` is unsupported; the build-arg exists only so CI can raise it for the negative floor check, and CI and the release workflow never pass it otherwise.
146
147
  4. **Registry Metadata Constraint**:
147
148
  - In `server.json`, the root `description` must be **strictly $\le$ 100 characters** to pass MCP Registry schema validation (longer strings trigger HTTP 422 errors).
@@ -210,6 +211,6 @@ coderabbit review --agent --uncommitted
210
211
 
211
212
  ## 🔄 CI & Releases
212
213
 
213
- CI is defined in `.github/workflows/ci.yml` (jobs: `lint-and-types`, `test` on Python 3.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`, checks that the runtime image has the project and none of the build-only packages (runtime dependencies such as `packaging` stay), checks that the image answers `initialize` and `tools/list` over stdio with no network, and checks that the builder stage fails at its `ca-certificates` floor check, before any pip step, when the floor is above the installed version), and `drift-check` (the same OpenAPI drift check as its own job; scheduled and manual runs only)). It runs on pushes and pull requests to `main`, weekly on `main` on Sunday at 15:53 America/New_York (`schedule` with `timezone`, after the Sunday 09:30 America/New_York Dependabot run in `.github/dependabot.yml`), and on manual dispatch (`workflow_dispatch`); the weekly run exists because merges by `dependabot-automerge.yml` use `GITHUB_TOKEN`, and pushes made with `GITHUB_TOKEN` don't trigger push workflows, so those merges get no `push` run. Run the commands above before opening a PR. `dependabot-automerge.yml` turns on squash auto-merge only for Dependabot PRs whose highest update is minor or patch; major updates wait for a human review. Docker base image updates (`package-ecosystem` `docker`) never auto-merge and always wait for a human review: Dependabot's docker ecosystem can move the image tag, not just its digest (for example `python:3.12-slim` to `python:3.14-slim`, a Python runtime upgrade that Dependabot labels a minor update), so the job logs a notice and leaves the PR open.
214
215
 
215
216
  `release.yml` runs on `v*` tag pushes only: it creates the GitHub Release, then builds the container image, pushes it to GHCR, attests it, and publishes to the MCP Registry. In the template repo the image is built only (no push), and the attest and registry jobs skip. Release procedure (tag-based versioning, release notes, pre-tag checks): **`COOKBOOK.md`** Recipes 1–2; product-repo migration steps: Recipe 9.
@@ -17,17 +17,17 @@ Statute and publication rows live only in the data files under `src/taxcode_mcp/
17
17
  | File | Holds |
18
18
  | --- | --- |
19
19
  | `jurisdictions.json` | Jurisdiction codes in catalog order. Rows load in this order, then in file order. |
20
- | `statutes/<code>.json` | One jurisdiction's statute rows (`us.json`, `pr.json`, `ga.json`, ...). `text_en` and `text_es` are lists of lines, joined with a newline when loaded. |
20
+ | `statutes/<code>.json` | One jurisdiction's statute rows (`us.json`, `pr.json`, `can.json`, `ga.json`, ...). `text_en`, `text_es` and optional `text_fr` (required on `CAN` rows, stored in `statutes_fr`) are lists of lines, joined with a newline when loaded. |
21
21
  | `publications/<code>.json` | Publications whose `id` starts with `<code>-`. |
22
22
  | `manifest/<code>.json` | One source record per statute and publication row and per rate table of that jurisdiction. |
23
- | `rates/<code>.json` | The rate table the compliance tools compute a state's tax from. See "Changing a rate table" below. |
23
+ | `rates/<code>.json` | The rate table the compliance tools compute a state's or country's tax from (`RATE_TABLE_MODELS` and `COUNTRY_RATE_TABLES` in `src/taxcode_mcp/catalog.py`). See "Changing a rate table" below. |
24
24
 
25
25
  Every manifest entry has every field below. A value we don't have is the explicit string `"not_recorded"`, never a missing key and never a guess.
26
26
 
27
27
  | Field | Meaning |
28
28
  | --- | --- |
29
29
  | `kind`, `id` | `statute` or `publication` and the row's `id`, or `rate_table` and `<code>-rates`. |
30
- | `url` | Must equal the row's (or rate table's) `source_url`. |
30
+ | `url` | Must equal the row's (or rate or federal table's) `source_url`. |
31
31
  | `edition` | Which text the source at `url` is: `as_enacted` (the law as passed), `amended_compilation` (a compilation with later amendments folded in, such as an OGP "según enmendada" text), or `"not_recorded"`. |
32
32
  | `official` | `true` when the URL is on the issuing government body's own site, `false` for a third-party site, or `"not_recorded"`. It says nothing about whether the stored text is official. |
33
33
  | `licence` | Reuse terms of the source, or `"not_recorded"`. |
@@ -36,7 +36,9 @@ Every manifest entry has every field below. A value we don't have is the explici
36
36
  | `enacting_law` | Law that enacted or last amended the text, or `"not_recorded"`. |
37
37
  | `effective_date` | Date the text took effect (`YYYY-MM-DD`), or `"not_recorded"`. |
38
38
  | `verification` | `verified_verbatim` (checked word for word against the fetched source; needs `retrieved` and `content_sha256`), `summary` (the stored text is a summary, not a copy), or `"not_recorded"`. |
39
- | `year_sources` | Optional, `rate_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`; 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
+ | `french_source` | Optional, `statute` entries only, after `verification`, and required when the row has `text_fr`. An object with `url` (https) and `content_sha256` (64 lowercase hex digits) for the fetched French source artifact. |
40
+ | `verification_note` | Optional, and only on a `rate_table` whose `verification` is `not_recorded`, after `verification` and before `year_sources`. A non-empty string saying why that table could not be confirmed. A checked table does not carry it. |
41
+ | `year_sources` | Optional, `rate_table` and `federal_table` entries only, as the last field. A list of the sources for figures of other tax years or corroborating second sources on `url`'s year, `tax_year` ascending. Each has exactly `tax_year`, `values` (the table values it confirms, keyed by their path in `params`, such as `rates[0].rate`, `deduction_mfj_2025` or `years[0].brackets[4].rate`, or for the federal table in its document, such as `years[6].single`; each must equal the table's value), `url` (https), `official` (`true`), `retrieved` and `content_sha256` (`"not_recorded"` when the bytes could not be kept). |
40
42
 
41
43
  To add or change a row:
42
44
 
@@ -49,7 +51,7 @@ A new jurisdiction also needs its code in `jurisdictions.json` and, for its name
49
51
 
50
52
  ## Changing a rate table
51
53
 
52
- Every deduction, exemption, bracket, rate and per-year value the compliance tools use lives in `src/taxcode_mcp/data/rates/<code>.json`, one file per state that has one (`RATE_TABLE_MODELS` in `src/taxcode_mcp/catalog.py`). FL and TX have none. Never add a rate as a Python literal.
54
+ Every deduction, exemption, bracket, rate and per-year value the compliance tools use lives in `src/taxcode_mcp/data/rates/<code>.json`, one file per state that has one plus country tables in `COUNTRY_RATE_TABLES` (`RATE_TABLE_MODELS` in `src/taxcode_mcp/catalog.py`). FL and TX have none. Never add a rate as a Python literal.
53
55
 
54
56
  - `model` names the shape of `params` and which formula reads it. It must match `RATE_TABLE_MODELS`.
55
57
  - Amounts and rates are floats (`1000.0`, not `1000`), because tool output prints them as stored.
@@ -57,8 +59,12 @@ Every deduction, exemption, bracket, rate and per-year value the compliance tool
57
59
  - Each `rates` step also carries its prose: a `flat_by_year` step (CO, NC) its whole `rate_desc`, and a `georgia` step the `law` that set that year's rate, which both Georgia answers cite. Georgia's flat rate starts with tax year 2024, so an earlier tax year gets the oldest step and its answers say they are an estimate.
58
60
  - Each table has a `source_url` and a `rate_table` entry in `manifest/<code>.json` with the same `url`. A table whose numbers have not been checked against official text keeps `"not_recorded"` in both. Record a source only once it has been checked, and only an official one: `url` is the document the brackets were read from, `retrieved` the day it was fetched and `content_sha256` the hash of the fetched bytes (`"not_recorded"` when the bytes could not be kept).
59
61
  - `registry` tables keep their original keys. A `_YYYY` suffix holds the value from that tax year on, and the unsuffixed key covers the years before. Never copy a current value into an earlier year.
60
- - The `flat_with_surtax` table's `surtax` and the `capital_gains_excise` table's `capital_gains_deduction` follow the same convention: `surtax_2024` or `capital_gains_deduction_2024`, after the model's own fields with years ascending, holds the value from 2024 on, and the unsuffixed key keeps the earlier years. Registry deductions take `_2024`, `_2025` and `_2026`.
61
- - 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.
62
+ - The `flat_with_surtax` table's `surtax`, the `capital_gains_excise` table's `capital_gains_deduction` and the `brackets_cumulative` table's `brackets` and `exemption` follow the same convention: `surtax_2024`, `capital_gains_deduction_2024`, `brackets_2025` or `exemption_2025`, after the model's own fields with years ascending for each name, holds the value from that year on, and the unsuffixed key keeps the earlier years. The `capital_gains_excise` table's `tier` (`{"over": ..., "rate": ...}`, an additional rate on the taxable gains over `over`) takes only `tier_YYYY` keys and doesn't apply before the first one. The `georgia` table's `standard_deduction` and `retirement_exclusion` take `_YYYY` keys the same way (`standard_deduction_2026`, `retirement_exclusion_2027`), after `rates`, years ascending. A tax year after `GA_LAST_FIXED_YEAR` (the last year whose deduction and rate HB 463 of 2026 fixes) uses that year's figures and is labeled an estimate, because HB 463's later increases and rate cuts depend on revenue tests.
63
+ - Registry deductions take `_2024`, `_2025` and `_2026`. Registry `brackets` and `rate_desc` take `brackets_YYYY` and `rate_desc_YYYY` for 2024 to 2030, and the four `credit_base_*` / `credit_phaseout_*` amounts take `_2025`. Each needs its unsuffixed key and comes after it, years ascending; `brackets_YYYY` is validated like `brackets` and doesn't count as one of the three graduated keys below. A tax year after `MS_LAST_ENACTED_RATE_YEAR`, `UT_LAST_CREDIT_AMOUNT_YEAR`, `NE_LAST_PUBLISHED_SCHEDULE_YEAR` or `OH_LAST_FIXED_SCHEDULE_YEAR` (tied by tests to the last year each table holds) carries that table's figures forward and is labeled an estimate in its rate prose.
64
+ - A graduated `registry` table says how it taxes income below its top bracket with exactly one of two keys. `brackets` is the state's official marginal schedule (`over` and `rate` only, the lowest step's `over` is `null`), and replaces the `top_*`, `zero_*` and `middle_*` keys. `middle_rate` is a single statutory rate for the middle band. Every `evaluate_state_residency` answer carries `middle_rate_is_estimate` (always `false`; the former 65%-of-top stand-in is gone). Never invent a middle-band rate where an official schedule exists.
62
65
  - A `registry` table may take a nonrefundable credit off the computed tax, as Utah's taxpayer tax credit does, with all six `credit_*` keys: `credit_rate` times the filing status's `credit_base`, less `credit_phaseout_rate` times the taxable income over its `credit_phaseout` amount, never below zero. Model such a credit as a credit, not as a deduction.
63
66
 
67
+ - The `canada_federal` model (`rates/can.json`, `COUNTRY_RATE_TABLES`) holds Canada's federal Part I schedule and `ITA s. 128.1` departure-tax parameters: consecutive ascending `years` (each with `tax_year`, graduated `brackets`, `credit_rate`, and `basic_personal_amount` carrying `maximum`, `minimum`, `phaseout_start` and `phaseout_end` for the `ITA s. 118(1.1)` phaseout between the fourth and fifth brackets) plus `capital_gains_inclusion_rate`, `sojourner_days`, `t1161_threshold`, `personal_use_reporting_threshold`, `personal_use_minimum` and `short_term_resident_months`, backed by `can-rates` and `year_sources` in `manifest/can.json`.
68
+ - The federal standard deduction by tax year lives in `src/taxcode_mcp/data/federal/standard_deduction.json` (`years`, consecutive and ascending, each with `tax_year`, `single` and `mfj`), with a `federal_table` entry `us-standard-deduction` in `manifest/us.json` and a `year_sources` item for each year. A `flat_by_year` table whose `deduction` is the string `"federal_standard_deduction"` (CO) uses that table's figure for the tax year, or the nearest year it holds, with an estimate label. Other tables keep their own sourced amounts: a state's conformity to a federal figure is its own law.
69
+
64
70
  The files load and are validated when the server starts. `tests/test_compliance_golden.py` pins the exact output of every compliance tool over a wide input grid, so a rate change also updates those files (`uv run python tests/golden_compliance.py --write`) and the diff shows which answers moved.
@@ -34,8 +34,8 @@ WORKDIR /app
34
34
  RUN python -m venv /opt/venv
35
35
  ENV PATH="/opt/venv/bin:$PATH"
36
36
 
37
- COPY docker/pip-bootstrap.txt /tmp/pip-bootstrap.txt
38
- COPY pyproject.toml README.md LICENSE ./
37
+ COPY docker/pip-bootstrap.txt docker/uv-bootstrap.txt docker/build-backend.txt /tmp/
38
+ COPY pyproject.toml uv.lock README.md LICENSE ./
39
39
  COPY src/ src/
40
40
 
41
41
  # The build context has no .git, so uv-dynamic-versioning cannot read the tag and
@@ -45,13 +45,34 @@ ARG UV_DYNAMIC_VERSIONING_BYPASS
45
45
  ENV UV_DYNAMIC_VERSIONING_BYPASS=${UV_DYNAMIC_VERSIONING_BYPASS}
46
46
 
47
47
  # pip 26.2.2 updates the certificates pip bundles, per FastMCP's October 2026 certificate
48
- # authority incident notice. This image 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. The project build backend
59
+ # (hatchling, uv-dynamic-versioning, and their transitive deps) is hash-pinned in
60
+ # docker/build-backend.txt and installed with --require-hashes --only-binary=:all: to
61
+ # /tmp/build-backend, outside the venv, and is on PYTHONPATH only for
62
+ # `pip install --no-deps --no-build-isolation .`. The runtime image copies only the venv, so it
63
+ # gets the project and its runtime dependencies but no build backend. Neither runtime nor build
64
+ # dependencies are resolved from PyPI by version range at build time.
65
+ # https://docs.astral.sh/uv/concepts/projects/export/ and
66
+ # https://pip.pypa.io/en/stable/topics/secure-installs/
67
+ # https://pip.pypa.io/en/stable/cli/pip_install/ (--no-build-isolation, --require-hashes)
53
68
  RUN pip install --no-cache-dir --require-hashes --only-binary=:all: -r /tmp/pip-bootstrap.txt && \
54
- pip install --no-cache-dir .
69
+ pip install --no-cache-dir --require-hashes --only-binary=:all: --target /tmp/uv -r /tmp/uv-bootstrap.txt && \
70
+ /tmp/uv/bin/uv export --locked --no-dev --no-emit-project --format requirements.txt \
71
+ -o /tmp/requirements.txt && \
72
+ pip install --no-cache-dir --require-hashes --only-binary=:all: -r /tmp/requirements.txt && \
73
+ pip install --no-cache-dir --require-hashes --only-binary=:all: --target /tmp/build-backend \
74
+ -r /tmp/build-backend.txt && \
75
+ PYTHONPATH=/tmp/build-backend pip install --no-cache-dir --no-deps --no-build-isolation .
55
76
 
56
77
  # ─── Stage 2: Runtime ─────────────────────────────────────────────────────────
57
78
  FROM python:3.14-slim@sha256:fbecd461fc72d21b2143c6eaba25143738079154a6d0ea3da3aec724f50eed4a AS runtime
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: mcp-server-taxcode
3
- Version: 1.1.0
3
+ Version: 1.3.0
4
4
  Summary: Enterprise Model Context Protocol (MCP) server for Tax Code
5
5
  Project-URL: Homepage, https://github.com/christianclaudio/mcp-server-taxcode
6
6
  Project-URL: Documentation, https://github.com/christianclaudio/mcp-server-taxcode#readme
@@ -16,24 +16,23 @@ Classifier: Intended Audience :: Developers
16
16
  Classifier: License :: OSI Approved :: Apache Software License
17
17
  Classifier: Operating System :: OS Independent
18
18
  Classifier: Programming Language :: Python :: 3
19
- Classifier: Programming Language :: Python :: 3.10
20
19
  Classifier: Programming Language :: Python :: 3.11
21
20
  Classifier: Programming Language :: Python :: 3.12
22
21
  Classifier: Programming Language :: Python :: 3.13
23
22
  Classifier: Programming Language :: Python :: 3.14
24
23
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
25
- Requires-Python: >=3.10
24
+ Requires-Python: >=3.11
26
25
  Requires-Dist: certifi>=2026.10.19
27
26
  Requires-Dist: duckdb>=1.5.6
28
- Requires-Dist: fastmcp>=4.1.3
27
+ Requires-Dist: fastmcp>=4.1.5
29
28
  Requires-Dist: httpx>=0.28.1
30
29
  Requires-Dist: mcp>=2.3.0
31
30
  Requires-Dist: pydantic-settings>=2.15.0
32
31
  Requires-Dist: pydantic>=2.13.5
33
32
  Provides-Extra: code-mode
34
- Requires-Dist: fastmcp[code-mode]>=4.1.3; extra == 'code-mode'
33
+ Requires-Dist: fastmcp[code-mode]>=4.1.5; extra == 'code-mode'
35
34
  Provides-Extra: dev
36
- Requires-Dist: fastmcp[code-mode]>=4.1.3; extra == 'dev'
35
+ Requires-Dist: fastmcp[code-mode]>=4.1.5; extra == 'dev'
37
36
  Requires-Dist: mypy>=2.4.0; extra == 'dev'
38
37
  Requires-Dist: opentelemetry-sdk>=1.45.1; extra == 'dev'
39
38
  Requires-Dist: pytest-asyncio>=1.4.0; extra == 'dev'
@@ -70,9 +69,9 @@ graph TD
70
69
  Gateway["FastMCP Root Gateway<br>(stdio / streamable-http)"]
71
70
  ParentMW["Parent Middleware<br>(Audit Logging, Timing, Secret Redaction, ReadOnly Gate)"]
72
71
  SysSub["System Sub-server (mount: 'system')<br>• system_get_health_status<br>• taxcode://system/reference/capabilities"]
73
- StatSub["Statutes Sub-server (mount: 'statutes')<br>• statutes_lookup_statute<br>• statutes_search_tax_code<br>• statutes_list_publications<br>• taxcode://statutes/{jurisdiction}/{section}"]
72
+ StatSub["Statutes Sub-server (mount: 'statutes')<br>• statutes_lookup_statute<br>• statutes_search_tax_code<br>• statutes_list_publications<br>• taxcode://statutes/{jurisdiction}/{section*}"]
74
73
  CompSub["Compliance Sub-server (mount: 'compliance')<br>• compliance_evaluate_pr_bona_fide_residency<br>• compliance_calculate_built_in_gain_sourcing<br>• compliance_evaluate_georgia_residency<br>• compliance_evaluate_state_residency"]
75
- DuckDB["DuckDB In-Memory & File Engine<br>(117 Statutes, 18 Publications, Full-Text Search, Temporal Versions)"]
74
+ DuckDB["DuckDB In-Memory & File Engine<br>(235 Statutes, 42 Publications, Full-Text Search, Temporal Versions)"]
76
75
 
77
76
  Client <-->|"JSON-RPC (tools/list, tools/call)"| Gateway
78
77
  Gateway --> ParentMW
@@ -91,14 +90,15 @@ graph TD
91
90
  * **Federal (`US`)**: IRC § 1, § 24, § 32, § 61, § 62, § 63, § 865, § 911, § 933, § 937, § 957, § 1411, § 6012, § 6688, 26 CFR § 1.937-1/2/3, and IRS publications (Pub. 17, Pub. 54, Pub. 501, Pub. 505, Pub. 570, Pub. 1321).
92
91
  * **Puerto Rico (`PR`)**: Act 60-2019 (Resident Individual Investors, Export Services & Opportunity Zone definitions, Sec. 6020.10 annual reports), Ley 1-2011 (including Sec. 1031.02 exemptions and Sec. 1062.01 wage withholding and Sec. 1062.03 withholding on payments for services), Act 22-2012 predecessor versions, and administrative publications (CC RI 21-10, CC RI 25-12, CC RI 26-13, DA 21-04, DA 23-04, BI RI 26-02).
93
92
  * **All 50 US States + District of Columbia**: Comprehensive statutory definitions and tax computations covering no-income-tax states (AK, FL, NV, NH, SD, TN, TX, WA, WY), flat-tax regimes (AZ, CO, GA, ID, IL, IN, IA, KS, KY, MI, MS, NC, PA, UT), and graduated/surtax jurisdictions (AL, AR, CA, CT, DE, DC, HI, LA, ME, MD, MA, MN, MO, MT, NE, NJ, NM, NY, ND, OH, OK, OR, RI, SC, VT, VA, WV, WI) including Convenience of the Employer rules (NY, PA, NJ, CT, DE, NE) and local piggyback taxes (MD, IN, OH, NY).
93
+ * **Canada federal (`CAN`)**: Income Tax Act ss. 2, 38, 114, 115, 117, 117.1, 118, 128.1, 153, 212 and 250 and Income Tax Regulations ss. 100, 102, 103, 105, 202, 805, 2600 and 2601, in the official English and French text of the Justice Canada consolidation (pinned laws-lois-xml commits; prior-year versions of ss. 117 and 118 from 2019), with unofficial Spanish summaries, plus CRA guidance (Folio S5-F1-C1, Forms T1161, T1243 and T1244, Leaving Canada). `statutes_lookup_statute` and `statutes_search_tax_code` take `lang="fr"`. `CA` stays California.
94
94
  * **Snippet Search, Full Text by Id**: `statutes_search_tax_code` matches and ranks on the full text but returns a short snippet (up to 300 characters around the first matched term) plus each result's `id`, citation, title, jurisdiction, year, validity and content labels. Pass an `id` to `statutes_lookup_statute` as `citation_or_section` for the full text.
95
- * **Bounded Responses with Paging**: Every statutes tool result stays under 32,000 characters of JSON. `statutes_lookup_statute` returns long text in pages of up to 8,000 characters per text field (`text_page` gives the offset and full lengths; pass `next_cursor` back as `page_cursor` for the next page). `statutes_search_tax_code` and `statutes_list_publications` clamp `limit` to 1..25 items per call, with `offset` and `next_offset` for the next page. The `taxcode://statutes/{jurisdiction}/{section}` resource (for example `taxcode://statutes/US/933`) uses the same 8,000-character pages and cap: a page that is not the last ends with the URI of the next one, which carries a `?page_cursor=` query.
95
+ * **Bounded Responses with Paging**: Every statutes tool result stays under 32,000 characters of JSON. `statutes_lookup_statute` returns long text in pages of up to 8,000 characters per text field (`text_page` gives the offset and full lengths; pass `next_cursor` back as `page_cursor` for the next page). `statutes_search_tax_code` and `statutes_list_publications` clamp `limit` to 1..25 items per call, with `offset` and `next_offset` for the next page. The `taxcode://statutes/{jurisdiction}/{section*}` resource (for example `taxcode://statutes/US/933`, or `taxcode://statutes/IL/5/201` for a section id that contains `/`) uses the same 8,000-character pages and cap: a page that is not the last ends with the URI of the next one, which carries a `?page_cursor=` query. The `{section*}` wildcard matches multi-segment section ids; a percent-encoded form such as `5%2F201` also works.
96
96
  * **Versioned Data Files**: Every statute and publication row lives in per-jurisdiction JSON under `src/taxcode_mcp/data/` with a source record per row, and the docs under `docs/` are generated from them (see [`CONTRIBUTING.md`](CONTRIBUTING.md)).
97
97
  * **Temporal Statutory Versioning**: Point-in-time statutory lookup with `superseded_year` filtering and descending historical ordering (`tax_year` parameter).
98
98
  * **Deterministic Compliance Engines**:
99
99
  * `evaluate_pr_bona_fide_residency`: Evaluates IRC § 937 presence (183-day, 549-day 3-year, 90-day US), tax home, and closer connection tests.
100
100
  * `calculate_built_in_gain_sourcing`: Allocates Section 937 / Act 60 capital gains across pre-move and post-move holding periods.
101
- * `evaluate_state_residency`: Multi-state statutory presence day-counter, permanent place of abode (PPA), domicile audit risk flags, and tax liability computation across all 50 US states and District of Columbia (51 jurisdictions total).
101
+ * `evaluate_state_residency`: Multi-state statutory presence day-counter, permanent place of abode (PPA), domicile audit risk flags, and tax liability computation across all 50 US states and District of Columbia (51 jurisdictions total). Optional `dependents`, Mississippi `spouse_agi` (MFJ combined returns; even split of the filing-status exemption and standard deduction; ignored for other states), and Utah `itemized_deductions` (federal itemized deductions excluding state income tax) refine KS/MS/OH/GA/UT liability; defaults keep prior results. `jurisdiction="CAN"` (or `"Canada"`) evaluates Canada federal residency (factual, 183-day sojourner, part-year emigrant, non-resident) and estimates federal Part I tax for 2019-2026; `event="emigration"` with `emigration_properties` adds the ITA s. 128.1 departure tax estimate and the T1161 reporting test.
102
102
  * **Profiles & Opt-in ToolSearch**:
103
103
  * Domain-mount profiles: `full`, `system`, `statutes`, `compliance`, `readonly`.
104
104
  * Job-shaped allowlist profiles: `researcher` (statutes + circulars), `advisor` (cross-border residency + BIG calculations).
@@ -25,9 +25,9 @@ graph TD
25
25
  Gateway["FastMCP Root Gateway<br>(stdio / streamable-http)"]
26
26
  ParentMW["Parent Middleware<br>(Audit Logging, Timing, Secret Redaction, ReadOnly Gate)"]
27
27
  SysSub["System Sub-server (mount: 'system')<br>• system_get_health_status<br>• taxcode://system/reference/capabilities"]
28
- StatSub["Statutes Sub-server (mount: 'statutes')<br>• statutes_lookup_statute<br>• statutes_search_tax_code<br>• statutes_list_publications<br>• taxcode://statutes/{jurisdiction}/{section}"]
28
+ StatSub["Statutes Sub-server (mount: 'statutes')<br>• statutes_lookup_statute<br>• statutes_search_tax_code<br>• statutes_list_publications<br>• taxcode://statutes/{jurisdiction}/{section*}"]
29
29
  CompSub["Compliance Sub-server (mount: 'compliance')<br>• compliance_evaluate_pr_bona_fide_residency<br>• compliance_calculate_built_in_gain_sourcing<br>• compliance_evaluate_georgia_residency<br>• compliance_evaluate_state_residency"]
30
- DuckDB["DuckDB In-Memory & File Engine<br>(117 Statutes, 18 Publications, Full-Text Search, Temporal Versions)"]
30
+ DuckDB["DuckDB In-Memory & File Engine<br>(235 Statutes, 42 Publications, Full-Text Search, Temporal Versions)"]
31
31
 
32
32
  Client <-->|"JSON-RPC (tools/list, tools/call)"| Gateway
33
33
  Gateway --> ParentMW
@@ -46,14 +46,15 @@ graph TD
46
46
  * **Federal (`US`)**: IRC § 1, § 24, § 32, § 61, § 62, § 63, § 865, § 911, § 933, § 937, § 957, § 1411, § 6012, § 6688, 26 CFR § 1.937-1/2/3, and IRS publications (Pub. 17, Pub. 54, Pub. 501, Pub. 505, Pub. 570, Pub. 1321).
47
47
  * **Puerto Rico (`PR`)**: Act 60-2019 (Resident Individual Investors, Export Services & Opportunity Zone definitions, Sec. 6020.10 annual reports), Ley 1-2011 (including Sec. 1031.02 exemptions and Sec. 1062.01 wage withholding and Sec. 1062.03 withholding on payments for services), Act 22-2012 predecessor versions, and administrative publications (CC RI 21-10, CC RI 25-12, CC RI 26-13, DA 21-04, DA 23-04, BI RI 26-02).
48
48
  * **All 50 US States + District of Columbia**: Comprehensive statutory definitions and tax computations covering no-income-tax states (AK, FL, NV, NH, SD, TN, TX, WA, WY), flat-tax regimes (AZ, CO, GA, ID, IL, IN, IA, KS, KY, MI, MS, NC, PA, UT), and graduated/surtax jurisdictions (AL, AR, CA, CT, DE, DC, HI, LA, ME, MD, MA, MN, MO, MT, NE, NJ, NM, NY, ND, OH, OK, OR, RI, SC, VT, VA, WV, WI) including Convenience of the Employer rules (NY, PA, NJ, CT, DE, NE) and local piggyback taxes (MD, IN, OH, NY).
49
+ * **Canada federal (`CAN`)**: Income Tax Act ss. 2, 38, 114, 115, 117, 117.1, 118, 128.1, 153, 212 and 250 and Income Tax Regulations ss. 100, 102, 103, 105, 202, 805, 2600 and 2601, in the official English and French text of the Justice Canada consolidation (pinned laws-lois-xml commits; prior-year versions of ss. 117 and 118 from 2019), with unofficial Spanish summaries, plus CRA guidance (Folio S5-F1-C1, Forms T1161, T1243 and T1244, Leaving Canada). `statutes_lookup_statute` and `statutes_search_tax_code` take `lang="fr"`. `CA` stays California.
49
50
  * **Snippet Search, Full Text by Id**: `statutes_search_tax_code` matches and ranks on the full text but returns a short snippet (up to 300 characters around the first matched term) plus each result's `id`, citation, title, jurisdiction, year, validity and content labels. Pass an `id` to `statutes_lookup_statute` as `citation_or_section` for the full text.
50
- * **Bounded Responses with Paging**: Every statutes tool result stays under 32,000 characters of JSON. `statutes_lookup_statute` returns long text in pages of up to 8,000 characters per text field (`text_page` gives the offset and full lengths; pass `next_cursor` back as `page_cursor` for the next page). `statutes_search_tax_code` and `statutes_list_publications` clamp `limit` to 1..25 items per call, with `offset` and `next_offset` for the next page. The `taxcode://statutes/{jurisdiction}/{section}` resource (for example `taxcode://statutes/US/933`) uses the same 8,000-character pages and cap: a page that is not the last ends with the URI of the next one, which carries a `?page_cursor=` query.
51
+ * **Bounded Responses with Paging**: Every statutes tool result stays under 32,000 characters of JSON. `statutes_lookup_statute` returns long text in pages of up to 8,000 characters per text field (`text_page` gives the offset and full lengths; pass `next_cursor` back as `page_cursor` for the next page). `statutes_search_tax_code` and `statutes_list_publications` clamp `limit` to 1..25 items per call, with `offset` and `next_offset` for the next page. The `taxcode://statutes/{jurisdiction}/{section*}` resource (for example `taxcode://statutes/US/933`, or `taxcode://statutes/IL/5/201` for a section id that contains `/`) uses the same 8,000-character pages and cap: a page that is not the last ends with the URI of the next one, which carries a `?page_cursor=` query. The `{section*}` wildcard matches multi-segment section ids; a percent-encoded form such as `5%2F201` also works.
51
52
  * **Versioned Data Files**: Every statute and publication row lives in per-jurisdiction JSON under `src/taxcode_mcp/data/` with a source record per row, and the docs under `docs/` are generated from them (see [`CONTRIBUTING.md`](CONTRIBUTING.md)).
52
53
  * **Temporal Statutory Versioning**: Point-in-time statutory lookup with `superseded_year` filtering and descending historical ordering (`tax_year` parameter).
53
54
  * **Deterministic Compliance Engines**:
54
55
  * `evaluate_pr_bona_fide_residency`: Evaluates IRC § 937 presence (183-day, 549-day 3-year, 90-day US), tax home, and closer connection tests.
55
56
  * `calculate_built_in_gain_sourcing`: Allocates Section 937 / Act 60 capital gains across pre-move and post-move holding periods.
56
- * `evaluate_state_residency`: Multi-state statutory presence day-counter, permanent place of abode (PPA), domicile audit risk flags, and tax liability computation across all 50 US states and District of Columbia (51 jurisdictions total).
57
+ * `evaluate_state_residency`: Multi-state statutory presence day-counter, permanent place of abode (PPA), domicile audit risk flags, and tax liability computation across all 50 US states and District of Columbia (51 jurisdictions total). Optional `dependents`, Mississippi `spouse_agi` (MFJ combined returns; even split of the filing-status exemption and standard deduction; ignored for other states), and Utah `itemized_deductions` (federal itemized deductions excluding state income tax) refine KS/MS/OH/GA/UT liability; defaults keep prior results. `jurisdiction="CAN"` (or `"Canada"`) evaluates Canada federal residency (factual, 183-day sojourner, part-year emigrant, non-resident) and estimates federal Part I tax for 2019-2026; `event="emigration"` with `emigration_properties` adds the ITA s. 128.1 departure tax estimate and the T1161 reporting test.
57
58
  * **Profiles & Opt-in ToolSearch**:
58
59
  * Domain-mount profiles: `full`, `system`, `statutes`, `compliance`, `readonly`.
59
60
  * Job-shaped allowlist profiles: `researcher` (statutes + circulars), `advisor` (cross-border residency + BIG calculations).