patent-client-agents 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. patent_client_agents-0.2.0/.beads/.gitignore +39 -0
  2. patent_client_agents-0.2.0/.beads/README.md +81 -0
  3. patent_client_agents-0.2.0/.beads/config.yaml +62 -0
  4. patent_client_agents-0.2.0/.beads/interactions.jsonl +0 -0
  5. patent_client_agents-0.2.0/.beads/issues.jsonl +9 -0
  6. patent_client_agents-0.2.0/.beads/metadata.json +5 -0
  7. patent_client_agents-0.2.0/.cache/hishel/.gitignore +2 -0
  8. patent_client_agents-0.2.0/.claude-plugin/plugin.json +19 -0
  9. patent_client_agents-0.2.0/.gitattributes +3 -0
  10. patent_client_agents-0.2.0/.github/workflows/ci.yml +82 -0
  11. patent_client_agents-0.2.0/.gitignore +31 -0
  12. patent_client_agents-0.2.0/.gitleaks.toml +21 -0
  13. patent_client_agents-0.2.0/.pre-commit-config.yaml +28 -0
  14. patent_client_agents-0.2.0/.python-version +1 -0
  15. patent_client_agents-0.2.0/CATALOG.md +39 -0
  16. patent_client_agents-0.2.0/CLAUDE.md +77 -0
  17. patent_client_agents-0.2.0/PKG-INFO +282 -0
  18. patent_client_agents-0.2.0/README.md +246 -0
  19. patent_client_agents-0.2.0/TODO.md +80 -0
  20. patent_client_agents-0.2.0/archive/DEVELOPMENT_PLAN.md +188 -0
  21. patent_client_agents-0.2.0/archive/README.md +13 -0
  22. patent_client_agents-0.2.0/archive/patentsview/__init__.py +90 -0
  23. patent_client_agents-0.2.0/archive/patentsview/api.py +365 -0
  24. patent_client_agents-0.2.0/archive/patentsview/client.py +614 -0
  25. patent_client_agents-0.2.0/archive/patentsview/query.py +170 -0
  26. patent_client_agents-0.2.0/archive/patentsview_tests/__init__.py +1 -0
  27. patent_client_agents-0.2.0/archive/patentsview_tests/test_client.py +409 -0
  28. patent_client_agents-0.2.0/archive/patentsview_tests/test_query.py +210 -0
  29. patent_client_agents-0.2.0/deploy/DEPLOYMENT.md +244 -0
  30. patent_client_agents-0.2.0/deploy/env.example +44 -0
  31. patent_client_agents-0.2.0/deploy/nginx-mcp.conf +43 -0
  32. patent_client_agents-0.2.0/deploy/patent-client-agents-mcp.service +19 -0
  33. patent_client_agents-0.2.0/docs/api/cpc.md +51 -0
  34. patent_client_agents-0.2.0/docs/api/epo-ops.md +63 -0
  35. patent_client_agents-0.2.0/docs/api/google-patents.md +77 -0
  36. patent_client_agents-0.2.0/docs/api/jpo.md +207 -0
  37. patent_client_agents-0.2.0/docs/api/mpep.md +57 -0
  38. patent_client_agents-0.2.0/docs/api/uspto-applications.md +86 -0
  39. patent_client_agents-0.2.0/docs/api/uspto-assignments.md +72 -0
  40. patent_client_agents-0.2.0/docs/api/uspto-bulkdata.md +45 -0
  41. patent_client_agents-0.2.0/docs/api/uspto-odp.md +116 -0
  42. patent_client_agents-0.2.0/docs/api/uspto-office-actions.md +95 -0
  43. patent_client_agents-0.2.0/docs/api/uspto-petitions.md +42 -0
  44. patent_client_agents-0.2.0/docs/api/uspto-publications.md +57 -0
  45. patent_client_agents-0.2.0/docs/installation.md +502 -0
  46. patent_client_agents-0.2.0/docs/mcp-stdio.md +112 -0
  47. patent_client_agents-0.2.0/pyproject.toml +99 -0
  48. patent_client_agents-0.2.0/resources/epo/en-ops-v3.2-documentation-version-1.3.20.pdf +0 -0
  49. patent_client_agents-0.2.0/resources/epo/en-ops.txt +8094 -0
  50. patent_client_agents-0.2.0/resources/jpo/jpo_api_handbook_v14_e.md +1262 -0
  51. patent_client_agents-0.2.0/resources/jpo/jpo_api_handbook_v14_e.pdf +0 -0
  52. patent_client_agents-0.2.0/resources/jpo/jpo_api_openapi.json +15434 -0
  53. patent_client_agents-0.2.0/resources/jpo/jpo_api_reference_e.js +15434 -0
  54. patent_client_agents-0.2.0/resources/uspto/ODP-API-Query-Spec.pdf +0 -0
  55. patent_client_agents-0.2.0/resources/uspto/uspto_odp_swagger.yaml +4160 -0
  56. patent_client_agents-0.2.0/scripts/lint_catalog.py +137 -0
  57. patent_client_agents-0.2.0/src/ip_tools/__init__.py +7 -0
  58. patent_client_agents-0.2.0/src/ip_tools/catalog/_TEMPLATE.md +75 -0
  59. patent_client_agents-0.2.0/src/ip_tools/catalog/cpc.md +61 -0
  60. patent_client_agents-0.2.0/src/ip_tools/catalog/epo-ops.md +72 -0
  61. patent_client_agents-0.2.0/src/ip_tools/catalog/google-patents.md +64 -0
  62. patent_client_agents-0.2.0/src/ip_tools/catalog/jpo.md +57 -0
  63. patent_client_agents-0.2.0/src/ip_tools/catalog/mpep.md +49 -0
  64. patent_client_agents-0.2.0/src/ip_tools/catalog/uspto-applications.md +74 -0
  65. patent_client_agents-0.2.0/src/ip_tools/catalog/uspto-assignments.md +52 -0
  66. patent_client_agents-0.2.0/src/ip_tools/catalog/uspto-bulkdata.md +63 -0
  67. patent_client_agents-0.2.0/src/ip_tools/catalog/uspto-odp.md +107 -0
  68. patent_client_agents-0.2.0/src/ip_tools/catalog/uspto-office-actions.md +64 -0
  69. patent_client_agents-0.2.0/src/ip_tools/catalog/uspto-petitions.md +60 -0
  70. patent_client_agents-0.2.0/src/ip_tools/catalog/uspto-publications.md +54 -0
  71. patent_client_agents-0.2.0/src/ip_tools/cpc/__init__.py +39 -0
  72. patent_client_agents-0.2.0/src/ip_tools/cpc/api.py +212 -0
  73. patent_client_agents-0.2.0/src/ip_tools/cpc/py.typed +0 -0
  74. patent_client_agents-0.2.0/src/ip_tools/epo_ops/__init__.py +61 -0
  75. patent_client_agents-0.2.0/src/ip_tools/epo_ops/api.py +341 -0
  76. patent_client_agents-0.2.0/src/ip_tools/epo_ops/client.py +454 -0
  77. patent_client_agents-0.2.0/src/ip_tools/epo_ops/data/ops_swagger.yaml +2226 -0
  78. patent_client_agents-0.2.0/src/ip_tools/epo_ops/models.py +214 -0
  79. patent_client_agents-0.2.0/src/ip_tools/epo_ops/parsing.py +562 -0
  80. patent_client_agents-0.2.0/src/ip_tools/epo_ops/py.typed +0 -0
  81. patent_client_agents-0.2.0/src/ip_tools/epo_ops/resources.py +93 -0
  82. patent_client_agents-0.2.0/src/ip_tools/google_patents/__init__.py +17 -0
  83. patent_client_agents-0.2.0/src/ip_tools/google_patents/api.py +429 -0
  84. patent_client_agents-0.2.0/src/ip_tools/google_patents/cache.py +207 -0
  85. patent_client_agents-0.2.0/src/ip_tools/google_patents/client.py +1256 -0
  86. patent_client_agents-0.2.0/src/ip_tools/google_patents/docs/__init__.py +4 -0
  87. patent_client_agents-0.2.0/src/ip_tools/google_patents/docs/search_guide.md +40 -0
  88. patent_client_agents-0.2.0/src/ip_tools/google_patents/parsers/__init__.py +5 -0
  89. patent_client_agents-0.2.0/src/ip_tools/google_patents/parsers/claims.py +342 -0
  90. patent_client_agents-0.2.0/src/ip_tools/google_patents/parsers/figures.py +116 -0
  91. patent_client_agents-0.2.0/src/ip_tools/google_patents/parsers/metadata.py +1035 -0
  92. patent_client_agents-0.2.0/src/ip_tools/google_patents/py.typed +0 -0
  93. patent_client_agents-0.2.0/src/ip_tools/google_patents/resources.py +15 -0
  94. patent_client_agents-0.2.0/src/ip_tools/jpo/__init__.py +138 -0
  95. patent_client_agents-0.2.0/src/ip_tools/jpo/api.py +518 -0
  96. patent_client_agents-0.2.0/src/ip_tools/jpo/client.py +956 -0
  97. patent_client_agents-0.2.0/src/ip_tools/jpo/models.py +591 -0
  98. patent_client_agents-0.2.0/src/ip_tools/jpo/py.typed +0 -0
  99. patent_client_agents-0.2.0/src/ip_tools/mcp/__init__.py +46 -0
  100. patent_client_agents-0.2.0/src/ip_tools/mcp/server.py +64 -0
  101. patent_client_agents-0.2.0/src/ip_tools/mcp/tools/__init__.py +0 -0
  102. patent_client_agents-0.2.0/src/ip_tools/mcp/tools/international.py +289 -0
  103. patent_client_agents-0.2.0/src/ip_tools/mcp/tools/mpep.py +51 -0
  104. patent_client_agents-0.2.0/src/ip_tools/mcp/tools/office_actions.py +114 -0
  105. patent_client_agents-0.2.0/src/ip_tools/mcp/tools/patent_assignments.py +135 -0
  106. patent_client_agents-0.2.0/src/ip_tools/mcp/tools/patents.py +272 -0
  107. patent_client_agents-0.2.0/src/ip_tools/mcp/tools/publications.py +139 -0
  108. patent_client_agents-0.2.0/src/ip_tools/mcp/tools/uspto.py +584 -0
  109. patent_client_agents-0.2.0/src/ip_tools/mpep/__init__.py +31 -0
  110. patent_client_agents-0.2.0/src/ip_tools/mpep/api.py +198 -0
  111. patent_client_agents-0.2.0/src/ip_tools/mpep/client.py +195 -0
  112. patent_client_agents-0.2.0/src/ip_tools/mpep/docs/usage.md +12 -0
  113. patent_client_agents-0.2.0/src/ip_tools/mpep/models.py +31 -0
  114. patent_client_agents-0.2.0/src/ip_tools/mpep/py.typed +0 -0
  115. patent_client_agents-0.2.0/src/ip_tools/mpep/resources.py +11 -0
  116. patent_client_agents-0.2.0/src/ip_tools/mpep/transformers.py +151 -0
  117. patent_client_agents-0.2.0/src/ip_tools/mpep/utils.py +15 -0
  118. patent_client_agents-0.2.0/src/ip_tools/py.typed +0 -0
  119. patent_client_agents-0.2.0/src/ip_tools/skill_install.py +108 -0
  120. patent_client_agents-0.2.0/src/ip_tools/skills/__init__.py +0 -0
  121. patent_client_agents-0.2.0/src/ip_tools/skills/ip_research/SKILL.md +169 -0
  122. patent_client_agents-0.2.0/src/ip_tools/skills/ip_research/__init__.py +0 -0
  123. patent_client_agents-0.2.0/src/ip_tools/skills/ip_research/install.sh +63 -0
  124. patent_client_agents-0.2.0/src/ip_tools/skills/ip_research/references/cache.md +112 -0
  125. patent_client_agents-0.2.0/src/ip_tools/skills/ip_research/references/cpc.md +55 -0
  126. patent_client_agents-0.2.0/src/ip_tools/skills/ip_research/references/epo_ops.md +166 -0
  127. patent_client_agents-0.2.0/src/ip_tools/skills/ip_research/references/google_patents.md +112 -0
  128. patent_client_agents-0.2.0/src/ip_tools/skills/ip_research/references/jpo.md +118 -0
  129. patent_client_agents-0.2.0/src/ip_tools/skills/ip_research/references/mpep.md +59 -0
  130. patent_client_agents-0.2.0/src/ip_tools/skills/ip_research/references/uspto_applications.md +84 -0
  131. patent_client_agents-0.2.0/src/ip_tools/skills/ip_research/references/uspto_assignments.md +77 -0
  132. patent_client_agents-0.2.0/src/ip_tools/skills/ip_research/references/uspto_bulkdata.md +44 -0
  133. patent_client_agents-0.2.0/src/ip_tools/skills/ip_research/references/uspto_odp.md +210 -0
  134. patent_client_agents-0.2.0/src/ip_tools/skills/ip_research/references/uspto_office_actions.md +61 -0
  135. patent_client_agents-0.2.0/src/ip_tools/skills/ip_research/references/uspto_petitions.md +42 -0
  136. patent_client_agents-0.2.0/src/ip_tools/skills/ip_research/references/uspto_publications.md +166 -0
  137. patent_client_agents-0.2.0/src/ip_tools/uspto_applications/__init__.py +69 -0
  138. patent_client_agents-0.2.0/src/ip_tools/uspto_applications/api.py +477 -0
  139. patent_client_agents-0.2.0/src/ip_tools/uspto_applications/py.typed +0 -0
  140. patent_client_agents-0.2.0/src/ip_tools/uspto_assignments/__init__.py +41 -0
  141. patent_client_agents-0.2.0/src/ip_tools/uspto_assignments/client.py +319 -0
  142. patent_client_agents-0.2.0/src/ip_tools/uspto_assignments/models.py +80 -0
  143. patent_client_agents-0.2.0/src/ip_tools/uspto_assignments/py.typed +0 -0
  144. patent_client_agents-0.2.0/src/ip_tools/uspto_bulkdata/__init__.py +37 -0
  145. patent_client_agents-0.2.0/src/ip_tools/uspto_bulkdata/api.py +130 -0
  146. patent_client_agents-0.2.0/src/ip_tools/uspto_bulkdata/data/2025BulkDataProductChart.pdf +0 -0
  147. patent_client_agents-0.2.0/src/ip_tools/uspto_bulkdata/data/2025BulkDataProductDescriptions.xlsx +0 -0
  148. patent_client_agents-0.2.0/src/ip_tools/uspto_bulkdata/data/2025_bulkdata_product_guide.md +42 -0
  149. patent_client_agents-0.2.0/src/ip_tools/uspto_bulkdata/data/bulkdata-response-schema.json +698 -0
  150. patent_client_agents-0.2.0/src/ip_tools/uspto_bulkdata/data/patent-data-schema.json +934 -0
  151. patent_client_agents-0.2.0/src/ip_tools/uspto_bulkdata/data/petition-decision-schema.json +175 -0
  152. patent_client_agents-0.2.0/src/ip_tools/uspto_bulkdata/py.typed +0 -0
  153. patent_client_agents-0.2.0/src/ip_tools/uspto_bulkdata/resources.py +35 -0
  154. patent_client_agents-0.2.0/src/ip_tools/uspto_odp/__init__.py +108 -0
  155. patent_client_agents-0.2.0/src/ip_tools/uspto_odp/client.py +674 -0
  156. patent_client_agents-0.2.0/src/ip_tools/uspto_odp/clients/__init__.py +17 -0
  157. patent_client_agents-0.2.0/src/ip_tools/uspto_odp/clients/applications.py +795 -0
  158. patent_client_agents-0.2.0/src/ip_tools/uspto_odp/clients/base.py +223 -0
  159. patent_client_agents-0.2.0/src/ip_tools/uspto_odp/clients/bulkdata.py +128 -0
  160. patent_client_agents-0.2.0/src/ip_tools/uspto_odp/clients/petitions.py +173 -0
  161. patent_client_agents-0.2.0/src/ip_tools/uspto_odp/clients/ptab_appeals.py +155 -0
  162. patent_client_agents-0.2.0/src/ip_tools/uspto_odp/clients/ptab_interferences.py +155 -0
  163. patent_client_agents-0.2.0/src/ip_tools/uspto_odp/clients/ptab_trials.py +493 -0
  164. patent_client_agents-0.2.0/src/ip_tools/uspto_odp/data/odp_swagger.yaml +11275 -0
  165. patent_client_agents-0.2.0/src/ip_tools/uspto_odp/data/release_state.json +5 -0
  166. patent_client_agents-0.2.0/src/ip_tools/uspto_odp/data/status_codes.md +239 -0
  167. patent_client_agents-0.2.0/src/ip_tools/uspto_odp/models/__init__.py +600 -0
  168. patent_client_agents-0.2.0/src/ip_tools/uspto_odp/models/applications.py +560 -0
  169. patent_client_agents-0.2.0/src/ip_tools/uspto_odp/models/base.py +28 -0
  170. patent_client_agents-0.2.0/src/ip_tools/uspto_odp/py.typed +0 -0
  171. patent_client_agents-0.2.0/src/ip_tools/uspto_odp/resources.py +222 -0
  172. patent_client_agents-0.2.0/src/ip_tools/uspto_odp/xml_parser.py +303 -0
  173. patent_client_agents-0.2.0/src/ip_tools/uspto_office_actions/__init__.py +29 -0
  174. patent_client_agents-0.2.0/src/ip_tools/uspto_office_actions/client.py +202 -0
  175. patent_client_agents-0.2.0/src/ip_tools/uspto_office_actions/models.py +201 -0
  176. patent_client_agents-0.2.0/src/ip_tools/uspto_petitions/__init__.py +21 -0
  177. patent_client_agents-0.2.0/src/ip_tools/uspto_petitions/api.py +154 -0
  178. patent_client_agents-0.2.0/src/ip_tools/uspto_petitions/py.typed +0 -0
  179. patent_client_agents-0.2.0/src/ip_tools/uspto_publications/__init__.py +35 -0
  180. patent_client_agents-0.2.0/src/ip_tools/uspto_publications/api.py +228 -0
  181. patent_client_agents-0.2.0/src/ip_tools/uspto_publications/client.py +320 -0
  182. patent_client_agents-0.2.0/src/ip_tools/uspto_publications/data/search_query.json +35 -0
  183. patent_client_agents-0.2.0/src/ip_tools/uspto_publications/data/searchable_indexes.md +327 -0
  184. patent_client_agents-0.2.0/src/ip_tools/uspto_publications/docs/__init__.py +4 -0
  185. patent_client_agents-0.2.0/src/ip_tools/uspto_publications/docs/search_guide.md +26 -0
  186. patent_client_agents-0.2.0/src/ip_tools/uspto_publications/docs/searchable_indexes.md +327 -0
  187. patent_client_agents-0.2.0/src/ip_tools/uspto_publications/models.py +242 -0
  188. patent_client_agents-0.2.0/src/ip_tools/uspto_publications/py.typed +0 -0
  189. patent_client_agents-0.2.0/src/ip_tools/uspto_publications/resources.py +24 -0
  190. patent_client_agents-0.2.0/src/ip_tools/uspto_publications/transformers.py +409 -0
  191. patent_client_agents-0.2.0/src/ip_tools/uspto_publications/utils.py +133 -0
  192. patent_client_agents-0.2.0/src/law_tools_core/__init__.py +62 -0
  193. patent_client_agents-0.2.0/src/law_tools_core/base_client.py +341 -0
  194. patent_client_agents-0.2.0/src/law_tools_core/cache.py +363 -0
  195. patent_client_agents-0.2.0/src/law_tools_core/exceptions.py +100 -0
  196. patent_client_agents-0.2.0/src/law_tools_core/filenames.py +233 -0
  197. patent_client_agents-0.2.0/src/law_tools_core/logging.py +79 -0
  198. patent_client_agents-0.2.0/src/law_tools_core/mcp/__init__.py +45 -0
  199. patent_client_agents-0.2.0/src/law_tools_core/mcp/_env.py +24 -0
  200. patent_client_agents-0.2.0/src/law_tools_core/mcp/annotations.py +18 -0
  201. patent_client_agents-0.2.0/src/law_tools_core/mcp/downloads.py +402 -0
  202. patent_client_agents-0.2.0/src/law_tools_core/mcp/middleware.py +188 -0
  203. patent_client_agents-0.2.0/src/law_tools_core/mcp/server_factory.py +69 -0
  204. patent_client_agents-0.2.0/src/law_tools_core/py.typed +0 -0
  205. patent_client_agents-0.2.0/src/law_tools_core/resilience.py +99 -0
  206. patent_client_agents-0.2.0/src/law_tools_core/tooling.py +24 -0
  207. patent_client_agents-0.2.0/tests/__init__.py +0 -0
  208. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_assignments_test_client_py_TestClient_test_search_by_application.yaml +71 -0
  209. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_assignments_test_client_py_TestClient_test_search_by_assignee.yaml +131 -0
  210. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_assignments_test_client_py_TestClient_test_search_by_assignor.yaml +200 -0
  211. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_assignments_test_client_py_TestClient_test_search_by_patent.yaml +71 -0
  212. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_assignments_test_client_py_TestClient_test_search_by_reel_frame.yaml +72 -0
  213. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_assignments_test_client_py_TestClient_test_search_multi_criteria.yaml +108 -0
  214. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_odp_test_ptab_py_TestPtabAppealsClient_test_download.yaml +60 -0
  215. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_odp_test_ptab_py_TestPtabAppealsClient_test_get_decisions_by_number.yaml +60 -0
  216. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_odp_test_ptab_py_TestPtabAppealsClient_test_search.yaml +106 -0
  217. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_odp_test_ptab_py_TestPtabAppealsClient_test_search_with_facets.yaml +107 -0
  218. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_odp_test_ptab_py_TestPtabInterferencesClient_test_download.yaml +72 -0
  219. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_odp_test_ptab_py_TestPtabInterferencesClient_test_get_decisions_by_number.yaml +62 -0
  220. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_odp_test_ptab_py_TestPtabInterferencesClient_test_search.yaml +161 -0
  221. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_odp_test_ptab_py_TestPtabInterferencesClient_test_search_with_fields.yaml +61 -0
  222. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_odp_test_ptab_py_TestPtabModels_test_appeal_model_fields.yaml +64 -0
  223. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_odp_test_ptab_py_TestPtabModels_test_interference_model_fields.yaml +79 -0
  224. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_odp_test_ptab_py_TestPtabModels_test_trial_proceeding_model_fields.yaml +55 -0
  225. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_odp_test_ptab_py_TestPtabTrialsClient_test_download_proceedings.yaml +57 -0
  226. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_odp_test_ptab_py_TestPtabTrialsClient_test_get_decisions_by_trial.yaml +65 -0
  227. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_odp_test_ptab_py_TestPtabTrialsClient_test_get_documents_by_trial.yaml +214 -0
  228. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_odp_test_ptab_py_TestPtabTrialsClient_test_get_proceeding.yaml +53 -0
  229. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_odp_test_ptab_py_TestPtabTrialsClient_test_search_decisions.yaml +141 -0
  230. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_odp_test_ptab_py_TestPtabTrialsClient_test_search_documents.yaml +73 -0
  231. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_odp_test_ptab_py_TestPtabTrialsClient_test_search_proceedings.yaml +65 -0
  232. patent_client_agents-0.2.0/tests/cassettes/tests_uspto_odp_test_ptab_py_TestPtabTrialsClient_test_search_proceedings_with_facets.yaml +69 -0
  233. patent_client_agents-0.2.0/tests/conftest.py +117 -0
  234. patent_client_agents-0.2.0/tests/cpc/__init__.py +0 -0
  235. patent_client_agents-0.2.0/tests/cpc/test_api.py +158 -0
  236. patent_client_agents-0.2.0/tests/epo_ops/__init__.py +0 -0
  237. patent_client_agents-0.2.0/tests/epo_ops/test_api.py +109 -0
  238. patent_client_agents-0.2.0/tests/epo_ops/test_client.py +83 -0
  239. patent_client_agents-0.2.0/tests/epo_ops/test_parsing.py +358 -0
  240. patent_client_agents-0.2.0/tests/google_patents/__init__.py +0 -0
  241. patent_client_agents-0.2.0/tests/google_patents/test_api.py +114 -0
  242. patent_client_agents-0.2.0/tests/google_patents/test_api_utils.py +270 -0
  243. patent_client_agents-0.2.0/tests/google_patents/test_builders.py +390 -0
  244. patent_client_agents-0.2.0/tests/google_patents/test_cache.py +259 -0
  245. patent_client_agents-0.2.0/tests/google_patents/test_models.py +277 -0
  246. patent_client_agents-0.2.0/tests/google_patents/test_parsers_claims.py +299 -0
  247. patent_client_agents-0.2.0/tests/google_patents/test_parsers_figures.py +295 -0
  248. patent_client_agents-0.2.0/tests/google_patents/test_parsers_metadata.py +212 -0
  249. patent_client_agents-0.2.0/tests/jpo/__init__.py +1 -0
  250. patent_client_agents-0.2.0/tests/jpo/test_client.py +774 -0
  251. patent_client_agents-0.2.0/tests/jpo/test_live.py +218 -0
  252. patent_client_agents-0.2.0/tests/jpo/test_models.py +527 -0
  253. patent_client_agents-0.2.0/tests/law_tools_core/__init__.py +0 -0
  254. patent_client_agents-0.2.0/tests/law_tools_core/test_filenames.py +149 -0
  255. patent_client_agents-0.2.0/tests/law_tools_core/test_mcp_downloads.py +142 -0
  256. patent_client_agents-0.2.0/tests/mpep/__init__.py +1 -0
  257. patent_client_agents-0.2.0/tests/mpep/data/mpep/search_response.json +4 -0
  258. patent_client_agents-0.2.0/tests/mpep/data/mpep/versions.html +4 -0
  259. patent_client_agents-0.2.0/tests/mpep/test_api.py +64 -0
  260. patent_client_agents-0.2.0/tests/mpep/test_client.py +169 -0
  261. patent_client_agents-0.2.0/tests/mpep/test_mpep_transformers.py +37 -0
  262. patent_client_agents-0.2.0/tests/mpep/test_transformers.py +178 -0
  263. patent_client_agents-0.2.0/tests/mpep/test_utils.py +37 -0
  264. patent_client_agents-0.2.0/tests/test_cache.py +266 -0
  265. patent_client_agents-0.2.0/tests/test_core.py +570 -0
  266. patent_client_agents-0.2.0/tests/uspto_applications/__init__.py +0 -0
  267. patent_client_agents-0.2.0/tests/uspto_applications/test_api.py +70 -0
  268. patent_client_agents-0.2.0/tests/uspto_assignments/__init__.py +1 -0
  269. patent_client_agents-0.2.0/tests/uspto_assignments/test_client.py +135 -0
  270. patent_client_agents-0.2.0/tests/uspto_bulkdata/__init__.py +0 -0
  271. patent_client_agents-0.2.0/tests/uspto_bulkdata/test_api.py +57 -0
  272. patent_client_agents-0.2.0/tests/uspto_odp/__init__.py +0 -0
  273. patent_client_agents-0.2.0/tests/uspto_odp/test_applications.py +257 -0
  274. patent_client_agents-0.2.0/tests/uspto_odp/test_base.py +363 -0
  275. patent_client_agents-0.2.0/tests/uspto_odp/test_client.py +85 -0
  276. patent_client_agents-0.2.0/tests/uspto_odp/test_ptab.py +298 -0
  277. patent_client_agents-0.2.0/tests/uspto_odp/test_xml_parser.py +296 -0
  278. patent_client_agents-0.2.0/tests/uspto_office_actions/__init__.py +0 -0
  279. patent_client_agents-0.2.0/tests/uspto_office_actions/test_client.py +319 -0
  280. patent_client_agents-0.2.0/tests/uspto_petitions/__init__.py +0 -0
  281. patent_client_agents-0.2.0/tests/uspto_petitions/test_api.py +71 -0
  282. patent_client_agents-0.2.0/tests/uspto_publications/__init__.py +0 -0
  283. patent_client_agents-0.2.0/tests/uspto_publications/test_api.py +62 -0
  284. patent_client_agents-0.2.0/tests/uspto_publications/test_transformers.py +482 -0
  285. patent_client_agents-0.2.0/tests/uspto_publications/test_utils.py +176 -0
  286. patent_client_agents-0.2.0/uv.lock +1481 -0
@@ -0,0 +1,39 @@
1
+ # SQLite databases
2
+ *.db
3
+ *.db?*
4
+ *.db-journal
5
+ *.db-wal
6
+ *.db-shm
7
+
8
+ # Daemon runtime files
9
+ daemon.lock
10
+ daemon.log
11
+ daemon.pid
12
+ bd.sock
13
+ sync-state.json
14
+ last-touched
15
+
16
+ # Local version tracking (prevents upgrade notification spam after git ops)
17
+ .local_version
18
+
19
+ # Legacy database files
20
+ db.sqlite
21
+ bd.db
22
+
23
+ # Worktree redirect file (contains relative path to main repo's .beads/)
24
+ # Must not be committed as paths would be wrong in other clones
25
+ redirect
26
+
27
+ # Merge artifacts (temporary files from 3-way merge)
28
+ beads.base.jsonl
29
+ beads.base.meta.json
30
+ beads.left.jsonl
31
+ beads.left.meta.json
32
+ beads.right.jsonl
33
+ beads.right.meta.json
34
+
35
+ # NOTE: Do NOT add negation patterns (e.g., !issues.jsonl) here.
36
+ # They would override fork protection in .git/info/exclude, allowing
37
+ # contributors to accidentally commit upstream issue databases.
38
+ # The JSONL files (issues.jsonl, interactions.jsonl) and config files
39
+ # are tracked by git by default since no pattern above ignores them.
@@ -0,0 +1,81 @@
1
+ # Beads - AI-Native Issue Tracking
2
+
3
+ Welcome to Beads! This repository uses **Beads** for issue tracking - a modern, AI-native tool designed to live directly in your codebase alongside your code.
4
+
5
+ ## What is Beads?
6
+
7
+ Beads is issue tracking that lives in your repo, making it perfect for AI coding agents and developers who want their issues close to their code. No web UI required - everything works through the CLI and integrates seamlessly with git.
8
+
9
+ **Learn more:** [github.com/steveyegge/beads](https://github.com/steveyegge/beads)
10
+
11
+ ## Quick Start
12
+
13
+ ### Essential Commands
14
+
15
+ ```bash
16
+ # Create new issues
17
+ bd create "Add user authentication"
18
+
19
+ # View all issues
20
+ bd list
21
+
22
+ # View issue details
23
+ bd show <issue-id>
24
+
25
+ # Update issue status
26
+ bd update <issue-id> --status in_progress
27
+ bd update <issue-id> --status done
28
+
29
+ # Sync with git remote
30
+ bd sync
31
+ ```
32
+
33
+ ### Working with Issues
34
+
35
+ Issues in Beads are:
36
+ - **Git-native**: Stored in `.beads/issues.jsonl` and synced like code
37
+ - **AI-friendly**: CLI-first design works perfectly with AI coding agents
38
+ - **Branch-aware**: Issues can follow your branch workflow
39
+ - **Always in sync**: Auto-syncs with your commits
40
+
41
+ ## Why Beads?
42
+
43
+ ✨ **AI-Native Design**
44
+ - Built specifically for AI-assisted development workflows
45
+ - CLI-first interface works seamlessly with AI coding agents
46
+ - No context switching to web UIs
47
+
48
+ 🚀 **Developer Focused**
49
+ - Issues live in your repo, right next to your code
50
+ - Works offline, syncs when you push
51
+ - Fast, lightweight, and stays out of your way
52
+
53
+ 🔧 **Git Integration**
54
+ - Automatic sync with git commits
55
+ - Branch-aware issue tracking
56
+ - Intelligent JSONL merge resolution
57
+
58
+ ## Get Started with Beads
59
+
60
+ Try Beads in your own projects:
61
+
62
+ ```bash
63
+ # Install Beads
64
+ curl -sSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash
65
+
66
+ # Initialize in your repo
67
+ bd init
68
+
69
+ # Create your first issue
70
+ bd create "Try out Beads"
71
+ ```
72
+
73
+ ## Learn More
74
+
75
+ - **Documentation**: [github.com/steveyegge/beads/docs](https://github.com/steveyegge/beads/tree/main/docs)
76
+ - **Quick Start Guide**: Run `bd quickstart`
77
+ - **Examples**: [github.com/steveyegge/beads/examples](https://github.com/steveyegge/beads/tree/main/examples)
78
+
79
+ ---
80
+
81
+ *Beads: Issue tracking that moves at the speed of thought* ⚡
@@ -0,0 +1,62 @@
1
+ # Beads Configuration File
2
+ # This file configures default behavior for all bd commands in this repository
3
+ # All settings can also be set via environment variables (BD_* prefix)
4
+ # or overridden with command-line flags
5
+
6
+ # Issue prefix for this repository (used by bd init)
7
+ # If not set, bd init will auto-detect from directory name
8
+ # Example: issue-prefix: "myproject" creates issues like "myproject-1", "myproject-2", etc.
9
+ # issue-prefix: ""
10
+
11
+ # Use no-db mode: load from JSONL, no SQLite, write back after each command
12
+ # When true, bd will use .beads/issues.jsonl as the source of truth
13
+ # instead of SQLite database
14
+ # no-db: false
15
+
16
+ # Disable daemon for RPC communication (forces direct database access)
17
+ # no-daemon: false
18
+
19
+ # Disable auto-flush of database to JSONL after mutations
20
+ # no-auto-flush: false
21
+
22
+ # Disable auto-import from JSONL when it's newer than database
23
+ # no-auto-import: false
24
+
25
+ # Enable JSON output by default
26
+ # json: false
27
+
28
+ # Default actor for audit trails (overridden by BD_ACTOR or --actor)
29
+ # actor: ""
30
+
31
+ # Path to database (overridden by BEADS_DB or --db)
32
+ # db: ""
33
+
34
+ # Auto-start daemon if not running (can also use BEADS_AUTO_START_DAEMON)
35
+ # auto-start-daemon: true
36
+
37
+ # Debounce interval for auto-flush (can also use BEADS_FLUSH_DEBOUNCE)
38
+ # flush-debounce: "5s"
39
+
40
+ # Git branch for beads commits (bd sync will commit to this branch)
41
+ # IMPORTANT: Set this for team projects so all clones use the same sync branch.
42
+ # This setting persists across clones (unlike database config which is gitignored).
43
+ # Can also use BEADS_SYNC_BRANCH env var for local override.
44
+ # If not set, bd sync will require you to run 'bd config set sync.branch <branch>'.
45
+ # sync-branch: "beads-sync"
46
+
47
+ # Multi-repo configuration (experimental - bd-307)
48
+ # Allows hydrating from multiple repositories and routing writes to the correct JSONL
49
+ # repos:
50
+ # primary: "." # Primary repo (where this database lives)
51
+ # additional: # Additional repos to hydrate from (read-only)
52
+ # - ~/beads-planning # Personal planning repo
53
+ # - ~/work-planning # Work planning repo
54
+
55
+ # Integration settings (access with 'bd config get/set')
56
+ # These are stored in the database, not in this file:
57
+ # - jira.url
58
+ # - jira.project
59
+ # - linear.url
60
+ # - linear.api-key
61
+ # - github.org
62
+ # - github.repo
File without changes
@@ -0,0 +1,9 @@
1
+ {"id":"ip-070","title":"Set up core module infrastructure","description":"Set up core infrastructure: base_client.py, cache.py, exceptions.py, resilience.py, tooling.py","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T10:46:49.155141-06:00","updated_at":"2026-01-06T10:51:43.877117-06:00","closed_at":"2026-01-06T10:51:43.877128-06:00","labels":["phase:1","type:infrastructure"]}
2
+ {"id":"ip-0dz","title":"Implement EPO OPS client","description":"Patent families, legal status, CPC classification","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T10:46:57.756306-06:00","updated_at":"2026-01-06T10:56:35.639821-06:00","closed_at":"2026-01-06T10:56:35.639824-06:00","labels":["phase:3","type:feature"]}
3
+ {"id":"ip-8js","title":"Implement JPO client","description":"Japanese patent lookup and English translations","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T10:47:10.934978-06:00","updated_at":"2026-01-06T10:56:35.697324-06:00","closed_at":"2026-01-06T10:56:35.697327-06:00","labels":["phase:3","type:feature"]}
4
+ {"id":"ip-bb2","title":"Set up test infrastructure","description":"Configure pytest-asyncio, VCR-style request recording, integration test markers","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T10:46:52.17517-06:00","updated_at":"2026-01-06T10:56:35.46497-06:00","closed_at":"2026-01-06T10:56:35.464983-06:00","labels":["phase:1","type:testing"]}
5
+ {"id":"ip-dtw","title":"Implement USPTO Assignments client","description":"Ownership lookup, assignment chain traversal","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T10:46:54.891412-06:00","updated_at":"2026-01-06T10:56:35.582979-06:00","closed_at":"2026-01-06T10:56:35.582982-06:00","labels":["phase:2","type:feature"]}
6
+ {"id":"ip-g1f","title":"Implement USPTO Publications client","description":"Full-text search, patent/application lookup, claims and description access","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T10:46:53.638789-06:00","updated_at":"2026-01-06T10:56:35.524451-06:00","closed_at":"2026-01-06T10:56:35.524454-06:00","labels":["phase:2","type:feature"]}
7
+ {"id":"ip-q0j","title":"Configure Claude Code plugin","description":"Plugin manifest, marketplace configuration, installation workflow","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T10:47:13.894843-06:00","updated_at":"2026-01-06T10:52:04.857349-06:00","closed_at":"2026-01-06T10:52:04.857351-06:00","labels":["phase:4","type:infrastructure"]}
8
+ {"id":"ip-rv4","title":"Create IP Research skill","description":"Claude Code skill for natural language patent research queries","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T10:47:12.444263-06:00","updated_at":"2026-01-06T10:52:04.915617-06:00","closed_at":"2026-01-06T10:52:04.915619-06:00","labels":["phase:4","type:skill"]}
9
+ {"id":"ip-zlx","title":"Implement Google Patents client","description":"Implement GooglePatentsClient: fetch by patent number, search, citation graph, Pydantic models","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T10:46:50.943909-06:00","updated_at":"2026-01-06T10:52:04.97252-06:00","closed_at":"2026-01-06T10:52:04.972523-06:00","labels":["phase:1","type:feature"]}
@@ -0,0 +1,5 @@
1
+ {
2
+ "database": "beads.db",
3
+ "jsonl_export": "issues.jsonl",
4
+ "last_bd_version": "0.27.0"
5
+ }
@@ -0,0 +1,2 @@
1
+ # Automatically created by Hishel
2
+ *
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "patent-client-agents",
3
+ "description": "Intellectual property research toolkit — async Python clients and 63 MCP tools for USPTO, EPO, Google Patents, JPO, MPEP, and CPC",
4
+ "version": "0.2.0",
5
+ "author": {
6
+ "name": "Parker Hancock",
7
+ "url": "https://github.com/parkerhancock"
8
+ },
9
+ "repository": "https://github.com/parkerhancock/ip_tools",
10
+ "license": "Apache-2.0",
11
+ "keywords": ["patent", "trademark", "intellectual-property", "uspto", "epo", "mcp"],
12
+ "skills": "src/ip_tools/skills",
13
+ "mcpServers": {
14
+ "patent-client-agents": {
15
+ "command": "uvx",
16
+ "args": ["--from", "${CLAUDE_PLUGIN_ROOT}[mcp]", "patent-client-agents-mcp"]
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,3 @@
1
+
2
+ # Use bd merge for beads JSONL files
3
+ .beads/issues.jsonl merge=beads
@@ -0,0 +1,82 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ lint:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+
15
+ - name: Install uv
16
+ uses: astral-sh/setup-uv@v4
17
+ with:
18
+ version: "latest"
19
+
20
+ - name: Set up Python
21
+ run: uv python install 3.12
22
+
23
+ - name: Install dependencies
24
+ run: uv sync --group dev
25
+
26
+ - name: Run ruff check
27
+ run: uv run ruff check .
28
+
29
+ - name: Run ruff format check
30
+ run: uv run ruff format --check .
31
+
32
+ typecheck:
33
+ runs-on: ubuntu-latest
34
+ steps:
35
+ - uses: actions/checkout@v4
36
+
37
+ - name: Install uv
38
+ uses: astral-sh/setup-uv@v4
39
+ with:
40
+ version: "latest"
41
+
42
+ - name: Set up Python
43
+ run: uv python install 3.12
44
+
45
+ - name: Install dependencies
46
+ run: uv sync --group dev
47
+
48
+ - name: Run type checking
49
+ run: uv run ty check src/
50
+ continue-on-error: true # Type errors don't fail CI yet
51
+
52
+ test:
53
+ runs-on: ubuntu-latest
54
+ strategy:
55
+ matrix:
56
+ python-version: ["3.12", "3.13"]
57
+ steps:
58
+ - uses: actions/checkout@v4
59
+
60
+ - name: Install uv
61
+ uses: astral-sh/setup-uv@v4
62
+ with:
63
+ version: "latest"
64
+
65
+ - name: Set up Python ${{ matrix.python-version }}
66
+ run: uv python install ${{ matrix.python-version }}
67
+
68
+ - name: Install dependencies
69
+ run: uv sync --group dev
70
+
71
+ - name: Run tests with coverage
72
+ run: |
73
+ uv pip install pytest-cov
74
+ uv run pytest --cov=ip_tools --cov-report=xml --cov-report=term-missing
75
+
76
+ - name: Upload coverage to Codecov
77
+ if: matrix.python-version == '3.12'
78
+ uses: codecov/codecov-action@v4
79
+ with:
80
+ token: ${{ secrets.CODECOV_TOKEN }}
81
+ files: ./coverage.xml
82
+ fail_ci_if_error: false
@@ -0,0 +1,31 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+
12
+ # IDE
13
+ .idea/
14
+ .vscode/
15
+ *.swp
16
+ *.swo
17
+
18
+ # Testing
19
+ .pytest_cache/
20
+ .coverage
21
+ coverage.xml
22
+ htmlcov/
23
+
24
+ # Type checking
25
+ .ty_cache/
26
+ .mypy_cache/
27
+
28
+ # OS
29
+ .DS_Store
30
+ Thumbs.db
31
+
@@ -0,0 +1,21 @@
1
+ # Gitleaks configuration for patent-client-agents.
2
+ #
3
+ # Extends the default rule set and allowlists specific upstream documentation
4
+ # files that contain illustrative placeholders and example URLs published by
5
+ # USPTO / JPO / EPO themselves. These aren't secrets we control, and the
6
+ # files are imported verbatim from upstream — reviewing them for leaks here
7
+ # is redundant and produces false positives every time upstream ships new
8
+ # examples.
9
+
10
+ [extend]
11
+ useDefault = true
12
+
13
+ [[allowlists]]
14
+ description = "Upstream USPTO / JPO / EPO OpenAPI specs and reference bundles"
15
+ paths = [
16
+ '''resources/uspto/uspto_odp_swagger\.yaml''',
17
+ '''resources/epo/en-ops\.txt''',
18
+ '''resources/jpo/jpo_api_openapi\.json''',
19
+ '''resources/jpo/jpo_api_reference_e\.js''',
20
+ '''src/ip_tools/uspto_odp/data/odp_swagger\.yaml''',
21
+ ]
@@ -0,0 +1,28 @@
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v5.0.0
4
+ hooks:
5
+ - id: trailing-whitespace
6
+ - id: end-of-file-fixer
7
+ - id: check-yaml
8
+ - id: check-added-large-files
9
+ - id: check-merge-conflict
10
+
11
+ - repo: https://github.com/astral-sh/ruff-pre-commit
12
+ rev: v0.9.2
13
+ hooks:
14
+ - id: ruff
15
+ args: [--fix]
16
+ - id: ruff-format
17
+
18
+ - repo: local
19
+ hooks:
20
+ - id: catalog-lint
21
+ name: Lint catalog pages against _TEMPLATE.md
22
+ entry: uv run python scripts/lint_catalog.py
23
+ language: system
24
+ pass_filenames: false
25
+ files: ^(src/ip_tools/catalog/|CATALOG\.md$)
26
+
27
+ # ty type checker disabled in pre-commit due to external library type issues
28
+ # Run manually with: uv run ty check src/ip_tools/
@@ -0,0 +1 @@
1
+ 3.12
@@ -0,0 +1,39 @@
1
+ # Patent & IP Data Connector Catalog
2
+
3
+ Canonical index of the patent and IP data sources shipped by `patent-client-agents`.
4
+
5
+ ## Active connectors
6
+
7
+ | Source | Description | Auth | MCP Tools | Downloads | Rate Limit |
8
+ |---|---|---|---:|:---:|---|
9
+ | [Google Patents](src/ip_tools/catalog/google-patents.md) | Global patent search, claims, figures, PDFs, families | None | 8 | ✓ | Unpublished (scraped) |
10
+ | [USPTO ODP](src/ip_tools/catalog/uspto-odp.md) | Applications, file wrapper, PTAB trials/appeals/interferences, petitions, bulk data via Open Data Portal | `USPTO_ODP_API_KEY` | 26 | ✓ | 60 req/min |
11
+ | [USPTO Applications](src/ip_tools/catalog/uspto-applications.md) | Function-level wrapper over `ApplicationsClient` (search, get, documents, family, PTAB) | `USPTO_ODP_API_KEY` | — | — | (inherits ODP) |
12
+ | [USPTO Office Actions](src/ip_tools/catalog/uspto-office-actions.md) | OA rejection analytics, cited references, full-text OA retrieval, enriched citations | `USPTO_ODP_API_KEY` | 4 | — | 60 req/min |
13
+ | [USPTO Publications](src/ip_tools/catalog/uspto-publications.md) | Patent Public Search (PPUBS) full-text and document retrieval | None | 4 | ✓ | Unpublished |
14
+ | [USPTO Assignments](src/ip_tools/catalog/uspto-assignments.md) | Patent ownership transfers via Assignment Center | None | 7 | — | Unpublished |
15
+ | [USPTO Petitions](src/ip_tools/catalog/uspto-petitions.md) | Wrapper for ODP petition decisions | `USPTO_ODP_API_KEY` | — | — | (inherits ODP) |
16
+ | [USPTO Bulk Data](src/ip_tools/catalog/uspto-bulkdata.md) | Bulk data product catalog + download manifests | `USPTO_ODP_API_KEY` | — | — | (inherits ODP) |
17
+ | [EPO OPS](src/ip_tools/catalog/epo-ops.md) | European patents — biblio, fulltext, families, legal events | `EPO_OPS_API_KEY` + `EPO_OPS_API_SECRET` | 12 | ✓ | 4 GB/week free tier |
18
+ | [CPC](src/ip_tools/catalog/cpc.md) | Cooperative Patent Classification lookup / search / IPC mapping (via EPO OPS) | `EPO_OPS_API_KEY` + `EPO_OPS_API_SECRET` | 3 | — | (inherits EPO OPS) |
19
+ | [MPEP](src/ip_tools/catalog/mpep.md) | Manual of Patent Examining Procedure search and section lookup | None | 2 | — | Unpublished (scraped) |
20
+
21
+ **Wrapper modules** — `uspto_applications`, `uspto_petitions`, and
22
+ `uspto_bulkdata` expose module-level functions that route through the same
23
+ underlying `UsptoOdpClient`. Their MCP tools are counted under
24
+ [uspto-odp](src/ip_tools/catalog/uspto-odp.md).
25
+
26
+ ## Inactive / deprecated
27
+
28
+ | Source | Status | Notes |
29
+ |---|---|---|
30
+ | [JPO](src/ip_tools/catalog/jpo.md) | Disabled | Module present; requires `JPO_API_USERNAME` + `JPO_API_PASSWORD` which are not broadly available. All clients skip at runtime if credentials are absent. |
31
+ | [patentsview](archive/patentsview/) | Deprecated | USPTO retired the PatentsView API (search.patentsview.org no longer resolves); module kept in `archive/` for reference only. |
32
+
33
+ ## By auth type
34
+
35
+ **No credentials required:** Google Patents, USPTO Publications, USPTO Assignments, MPEP.
36
+
37
+ **Free API key:** USPTO ODP (and wrappers — Applications, Office Actions, Petitions, Bulk Data) via `USPTO_ODP_API_KEY`; EPO OPS and CPC via `EPO_OPS_API_KEY` + `EPO_OPS_API_SECRET`.
38
+
39
+ **Credentialed / disabled:** JPO via `JPO_API_USERNAME` + `JPO_API_PASSWORD`.
@@ -0,0 +1,77 @@
1
+ # IP Tools
2
+
3
+ Async Python library for patent and IP data from USPTO, EPO, Google Patents, and JPO.
4
+
5
+ ## Development
6
+
7
+ ```bash
8
+ uv sync --group dev # Install dependencies
9
+ uv run pytest # Run tests (767 tests, ~15s)
10
+ uv run ruff check src/ tests/ # Lint
11
+ uv run ruff format src/ tests/ # Format
12
+ ```
13
+
14
+ ## Testing
15
+
16
+ Tests use `vcrpy` to replay recorded HTTP interactions. Cassettes live at
17
+ `tests/cassettes/` with filenames derived from each test's nodeid.
18
+
19
+ ```bash
20
+ uv run pytest # Replay from cassettes (default)
21
+ uv run pytest --vcr-record=once # Record missing cassettes
22
+ uv run pytest --vcr-record=all # Re-record all cassettes
23
+ uv run pytest --run-live-uspto # Run live USPTO tests
24
+ uv run pytest --run-live-jpo # Run live JPO tests
25
+ uv run pytest --cov=ip_tools --cov-report=term-missing # Coverage
26
+ ```
27
+
28
+ When recording new cassettes, ensure auth headers are scrubbed. The conftest
29
+ redacts `authorization`, `x-api-key`, `api_key`, and `apiKey` automatically;
30
+ verify with `gitleaks protect --staged` before committing.
31
+
32
+ ## Architecture
33
+
34
+ ```
35
+ src/
36
+ law_tools_core/ # Shared HTTP scaffolding (BaseAsyncClient, cache, retry,
37
+ # exceptions, logging). Shipped in the same wheel.
38
+ ip_tools/
39
+ uspto_odp/ # USPTO Open Data Portal — applications, PTAB, petitions
40
+ # (needs USPTO_ODP_API_KEY)
41
+ uspto_applications/ # High-level wrapper over ODP applications endpoints
42
+ uspto_publications/ # USPTO Public Search (PPUBS)
43
+ uspto_assignments/ # USPTO Assignment Center records
44
+ uspto_petitions/ # USPTO petitions API
45
+ uspto_bulkdata/ # USPTO bulk data product catalog
46
+ uspto_office_actions/ # Office-action rejections, citations, full text
47
+ epo_ops/ # EPO Open Patent Services (needs EPO_OPS_API_KEY/SECRET)
48
+ google_patents/ # Scrapes Google Patents (no API key)
49
+ jpo/ # Japan Patent Office (needs JPO_API_USERNAME/PASSWORD)
50
+ cpc/ # CPC classification lookups (via EPO OPS)
51
+ mpep/ # Manual of Patent Examining Procedure search
52
+ skills/ip_research/ # Skill content packaged with the wheel; downstream
53
+ # consumers can read it via importlib.resources.
54
+ archive/ # Deprecated modules kept for reference, not shipped.
55
+ # (patentsview: upstream API retired by USPTO.)
56
+ ```
57
+
58
+ ## Error Handling
59
+
60
+ Log-first pattern for API errors: `ApiError.__str__()` appends the log-file
61
+ path so agents can inspect details without keeping full stacktraces in
62
+ context. Base class `LawToolsCoreError` (from `law_tools_core.exceptions`)
63
+ and plain validation/config errors use vanilla `Exception.__str__`.
64
+
65
+ File logging is configured per consumer app via
66
+ `law_tools_core.logging.configure(app_name)`. `ip_tools` calls
67
+ `configure("ip_tools")` on import → `~/.cache/ip_tools/ip_tools.log`.
68
+
69
+ ## Key Conventions
70
+
71
+ - All clients extend `law_tools_core.BaseAsyncClient` and use async context managers.
72
+ - HTTP caching: `hishel` + SQLite with WAL pragmas via `RetryingAsyncSqliteStorage`.
73
+ - Retry: `tenacity` `default_retryer` (4 attempts, exponential jitter).
74
+ - Models are Pydantic v2.
75
+ - The skill is packaged inside the wheel at `ip_tools/skills/ip_research/` so
76
+ `importlib.resources.files("ip_tools") / "skills" / "ip_research"` works
77
+ regardless of filesystem layout.