patents-mcp-server 1.0.0

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 (86) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +191 -0
  3. package/dist/base.client-zZnUjoIb.js +2 -0
  4. package/dist/base.client-zZnUjoIb.js.map +1 -0
  5. package/dist/clients/base.client.d.ts +19 -0
  6. package/dist/clients/base.client.js +1 -0
  7. package/dist/clients/bigquery.client.d.ts +14 -0
  8. package/dist/clients/bigquery.client.js +66 -0
  9. package/dist/clients/bigquery.client.js.map +1 -0
  10. package/dist/clients/epo-ops.client.d.ts +13 -0
  11. package/dist/clients/epo-ops.client.js +2 -0
  12. package/dist/clients/epo-ops.client.js.map +1 -0
  13. package/dist/clients/odp.client.d.ts +52 -0
  14. package/dist/clients/odp.client.js +2 -0
  15. package/dist/clients/odp.client.js.map +1 -0
  16. package/dist/clients/patentsview.client.d.ts +38 -0
  17. package/dist/clients/patentsview.client.js +2 -0
  18. package/dist/clients/patentsview.client.js.map +1 -0
  19. package/dist/generated/odp/index.d.ts +2 -0
  20. package/dist/generated/odp/index.js +1 -0
  21. package/dist/generated/odp/types.gen.d.ts +4432 -0
  22. package/dist/generated/odp/types.gen.js +1 -0
  23. package/dist/generated/odp/zod.gen.d.ts +7504 -0
  24. package/dist/generated/odp/zod.gen.js +2 -0
  25. package/dist/generated/odp/zod.gen.js.map +1 -0
  26. package/dist/generated/patentsview/index.d.ts +2 -0
  27. package/dist/generated/patentsview/index.js +1 -0
  28. package/dist/generated/patentsview/types.gen.d.ts +2454 -0
  29. package/dist/generated/patentsview/types.gen.js +1 -0
  30. package/dist/generated/patentsview/zod.gen.d.ts +3376 -0
  31. package/dist/generated/patentsview/zod.gen.js +2 -0
  32. package/dist/generated/patentsview/zod.gen.js.map +1 -0
  33. package/dist/index.d.ts +1 -0
  34. package/dist/index.js +3 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/lib/config.d.ts +24 -0
  37. package/dist/lib/config.js +2 -0
  38. package/dist/lib/config.js.map +1 -0
  39. package/dist/lib/errors.d.ts +7 -0
  40. package/dist/lib/errors.js +2 -0
  41. package/dist/lib/errors.js.map +1 -0
  42. package/dist/lib/patent-number.d.ts +5 -0
  43. package/dist/lib/patent-number.js +2 -0
  44. package/dist/lib/patent-number.js.map +1 -0
  45. package/dist/lib/retry.d.ts +10 -0
  46. package/dist/lib/retry.js +2 -0
  47. package/dist/lib/retry.js.map +1 -0
  48. package/dist/lib/types.d.ts +22 -0
  49. package/dist/lib/types.js +1 -0
  50. package/dist/prompts/index.d.ts +7 -0
  51. package/dist/prompts/index.js +255 -0
  52. package/dist/prompts/index.js.map +1 -0
  53. package/dist/resources/index.d.ts +7 -0
  54. package/dist/resources/index.js +44 -0
  55. package/dist/resources/index.js.map +1 -0
  56. package/dist/server.d.ts +8 -0
  57. package/dist/server.js +2 -0
  58. package/dist/server.js.map +1 -0
  59. package/dist/tools/bigquery.tools.d.ts +7 -0
  60. package/dist/tools/bigquery.tools.js +14 -0
  61. package/dist/tools/bigquery.tools.js.map +1 -0
  62. package/dist/tools/citations.tools.d.ts +7 -0
  63. package/dist/tools/citations.tools.js +2 -0
  64. package/dist/tools/citations.tools.js.map +1 -0
  65. package/dist/tools/epo.tools.d.ts +7 -0
  66. package/dist/tools/epo.tools.js +18 -0
  67. package/dist/tools/epo.tools.js.map +1 -0
  68. package/dist/tools/index.d.ts +7 -0
  69. package/dist/tools/index.js +2 -0
  70. package/dist/tools/index.js.map +1 -0
  71. package/dist/tools/odp.tools.d.ts +7 -0
  72. package/dist/tools/odp.tools.js +2 -0
  73. package/dist/tools/odp.tools.js.map +1 -0
  74. package/dist/tools/office-actions.tools.d.ts +7 -0
  75. package/dist/tools/office-actions.tools.js +2 -0
  76. package/dist/tools/office-actions.tools.js.map +1 -0
  77. package/dist/tools/patentsview.tools.d.ts +7 -0
  78. package/dist/tools/patentsview.tools.js +2 -0
  79. package/dist/tools/patentsview.tools.js.map +1 -0
  80. package/dist/tools/ptab.tools.d.ts +7 -0
  81. package/dist/tools/ptab.tools.js +2 -0
  82. package/dist/tools/ptab.tools.js.map +1 -0
  83. package/dist/tools/utility.tools.d.ts +7 -0
  84. package/dist/tools/utility.tools.js +2 -0
  85. package/dist/tools/utility.tools.js.map +1 -0
  86. package/package.json +67 -0
@@ -0,0 +1,255 @@
1
+ const e=e=>{e.addPrompt({name:`prior_art_search`,description:`Workflow for finding prior art across all available patent data sources`,arguments:[{name:`invention_description`,description:`Description of the invention or technology to search for`,required:!0},{name:`key_terms`,description:`Key technical terms and synonyms (comma-separated)`,required:!1},{name:`cpc_codes`,description:`Relevant CPC classification codes (comma-separated)`,required:!1}],load:async e=>`# Prior Art Search Workflow
2
+
3
+ ## Invention Description
4
+ ${e.invention_description}
5
+
6
+ ${e.key_terms?`## Key Terms\n${e.key_terms}\n`:``}
7
+ ${e.cpc_codes?`## CPC Codes\n${e.cpc_codes}\n`:``}
8
+
9
+ ## Search Strategy
10
+
11
+ ### Step 1: Keyword Search
12
+ Search across patent databases using key terms and synonyms:
13
+ - Use \`patentsview-search-patents\` for US granted patents (full-text search)
14
+ - Use \`epo-search-patents\` for international patents (CQL: ti/ab/ta fields)
15
+ - Use \`bigquery-patent-search\` for full-text claims search at scale
16
+
17
+ ### Step 2: Classification Search
18
+ Search by CPC/IPC codes for relevant technology areas:
19
+ - Use \`patentsview-search-by-cpc\` for US patents by CPC code
20
+ - Use \`epo-search-patents\` with cpc= field for international coverage
21
+
22
+ ### Step 3: Assignee/Inventor Search
23
+ Identify key players and their patent portfolios:
24
+ - Use \`patentsview-search-assignees\` to find relevant companies
25
+ - Use \`patentsview-search-inventors\` to find key inventors
26
+
27
+ ### Step 4: Citation Analysis
28
+ Trace citation networks from relevant patents found:
29
+ - Use \`citations-get-enriched\` for enriched citation data
30
+ - Use \`bigquery-citation-network\` for deeper citation graph analysis
31
+
32
+ ### Step 5: Family Analysis
33
+ For key prior art found, check international coverage:
34
+ - Use \`epo-family-lookup\` for INPADOC family members
35
+ - Use \`epo-legal-status\` to check if patents are still in force
36
+
37
+ ### Step 6: Review & Document
38
+ Compile findings with patent numbers, key claims, and relevance assessment.`}),e.addPrompt({name:`patent_validity`,description:`Structured approach to analyzing patent validity including prior art, prosecution history, and claim construction`,arguments:[{name:`patent_number`,description:`Patent number to analyze`,required:!0},{name:`claims_of_interest`,description:`Specific claim numbers to focus on (comma-separated)`,required:!1}],load:async e=>`# Patent Validity Analysis: ${e.patent_number}
39
+
40
+ ${e.claims_of_interest?`## Claims of Interest: ${e.claims_of_interest}\n`:``}
41
+
42
+ ## Analysis Workflow
43
+
44
+ ### Step 1: Patent Details
45
+ Retrieve complete patent information:
46
+ - Use \`patentsview-get-patent\` for bibliographic data
47
+ - Use \`patentsview-get-claims\` or \`epo-get-claims\` for claim text
48
+ - Use \`patentsview-get-description\` or \`epo-get-description\` for specification
49
+
50
+ ### Step 2: Prosecution History
51
+ Review the patent's prosecution history:
52
+ - Use \`odp-get-transactions\` for prosecution events
53
+ - Use \`office-action-get-text\` for office action content
54
+ - Use \`office-action-get-rejections\` for rejection details
55
+ - Use \`odp-get-continuity\` for priority chain
56
+
57
+ ### Step 3: Prior Art Citations
58
+ Analyze cited prior art:
59
+ - Use \`citations-get-enriched\` for citation data
60
+ - Use \`office-action-get-citations\` for examiner-cited references
61
+ - Use \`citations-get-metrics\` for citation impact
62
+
63
+ ### Step 4: PTAB Proceedings
64
+ Check for post-grant challenges:
65
+ - Use \`ptab-search-proceedings\` with the patent number
66
+ - Use \`ptab-search-decisions\` for related decisions
67
+
68
+ ### Step 5: Claim Construction
69
+ Analyze claim scope and limitations:
70
+ - Review claim language from Step 1
71
+ - Cross-reference with prosecution history amendments
72
+ - Identify means-plus-function limitations
73
+
74
+ ### Step 6: Validity Assessment
75
+ Compile validity analysis covering:
76
+ - Novelty (35 USC 102) — prior art predating priority date
77
+ - Obviousness (35 USC 103) — combinations of prior art
78
+ - Written description (35 USC 112) — specification support
79
+ - Prosecution history estoppel — narrowing amendments`}),e.addPrompt({name:`competitor_portfolio`,description:`Analyze a competitor's patent portfolio including trends, key technologies, and strategic insights`,arguments:[{name:`company_name`,description:`Name of the company to analyze`,required:!0},{name:`technology_area`,description:`Specific technology area to focus on (optional)`,required:!1}],load:async e=>`# Competitor Patent Portfolio Analysis: ${e.company_name}
80
+
81
+ ${e.technology_area?`## Technology Focus: ${e.technology_area}\n`:``}
82
+
83
+ ## Analysis Workflow
84
+
85
+ ### Step 1: Identify Portfolio
86
+ Find all patents assigned to the company:
87
+ - Use \`patentsview-search-assignees\` to find disambiguated assignee ID
88
+ - Use \`patentsview-search-patents\` with assignee filter
89
+ - Use \`epo-search-patents\` with pa="${e.company_name}" for international filings
90
+ - Use \`odp-search-applications\` for pending US applications
91
+
92
+ ### Step 2: Technology Breakdown
93
+ Classify the portfolio by technology area:
94
+ - Use \`patentsview-search-by-cpc\` for CPC classification distribution
95
+ - Use \`bigquery-cpc-analytics\` for statistical analysis
96
+ - Identify core technology clusters
97
+
98
+ ### Step 3: Filing Trends
99
+ Analyze temporal patterns:
100
+ - Track filing volumes over time
101
+ - Identify emerging technology areas
102
+ - Detect strategic shifts in R&D focus
103
+
104
+ ### Step 4: Key Patents
105
+ Identify the most important patents:
106
+ - Use \`citations-get-metrics\` for highly-cited patents
107
+ - Use \`litigation-search\` for patents involved in litigation
108
+ - Use \`ptab-search-proceedings\` for challenged patents
109
+
110
+ ### Step 5: Geographic Coverage
111
+ Assess worldwide patent strategy:
112
+ - Use \`epo-family-lookup\` for family sizes
113
+ - Use \`epo-legal-status\` for active jurisdictions
114
+ - Map geographic protection strategy
115
+
116
+ ### Step 6: Strategic Assessment
117
+ Compile portfolio insights:
118
+ - Core vs. peripheral technology areas
119
+ - Defensive vs. offensive patent strategy
120
+ - White space opportunities
121
+ - Potential licensing or acquisition targets`}),e.addPrompt({name:`ptab_research`,description:`Research PTAB proceedings (IPR/PGR/CBM) for a patent or technology area`,arguments:[{name:`patent_number`,description:`Patent number to research (optional if using query)`,required:!1},{name:`query`,description:`Search query for PTAB proceedings`,required:!1}],load:async e=>`# PTAB Research
122
+
123
+ ${e.patent_number?`## Patent: ${e.patent_number}\n`:``}
124
+ ${e.query?`## Query: ${e.query}\n`:``}
125
+
126
+ ## Research Workflow
127
+
128
+ ### Step 1: Find Proceedings
129
+ - Use \`ptab-search-proceedings\` to find IPR/PGR/CBM proceedings
130
+ - Filter by type (IPR, PGR, CBM) as needed
131
+ - Check proceeding status (instituted, denied, settled, final written decision)
132
+
133
+ ### Step 2: Review Documents
134
+ For each relevant proceeding:
135
+ - Use \`ptab-get-proceeding\` for proceeding details
136
+ - Use \`ptab-get-documents\` for filed documents
137
+ - Review petition, patent owner response, and institution decision
138
+
139
+ ### Step 3: Analyze Decisions
140
+ - Use \`ptab-search-decisions\` for trial decisions
141
+ - Use \`ptab-get-decision\` for detailed decision analysis
142
+ - Track claim-by-claim outcomes
143
+
144
+ ### Step 4: Appeal History
145
+ - Use \`ptab-search-appeals\` for ex parte appeal history
146
+ - Use \`ptab-get-appeal\` for appeal details
147
+ - Check Federal Circuit outcomes if applicable
148
+
149
+ ### Step 5: Impact Assessment
150
+ - Which claims survived? Which were cancelled?
151
+ - What prior art was most effective?
152
+ - How does this affect the patent's enforceability?`}),e.addPrompt({name:`freedom_to_operate`,description:`FTO analysis methodology — identify patents that could block a product or technology`,arguments:[{name:`product_description`,description:`Description of the product or technology to assess`,required:!0},{name:`target_markets`,description:`Target jurisdictions/markets (comma-separated, e.g., US, EP, JP)`,required:!1},{name:`key_features`,description:`Key technical features of the product (comma-separated)`,required:!1}],load:async e=>`# Freedom to Operate Analysis
153
+
154
+ ## Product Description
155
+ ${e.product_description}
156
+
157
+ ${e.target_markets?`## Target Markets: ${e.target_markets}\n`:``}
158
+ ${e.key_features?`## Key Features: ${e.key_features}\n`:``}
159
+
160
+ ## FTO Methodology
161
+
162
+ ### Step 1: Define Scope
163
+ - Identify key technical features of the product
164
+ - Determine relevant CPC/IPC classification codes
165
+ - Define target jurisdictions for analysis
166
+
167
+ ### Step 2: Patent Search
168
+ Comprehensive search for potentially blocking patents:
169
+ - Use \`patentsview-search-patents\` for US patents
170
+ - Use \`epo-search-patents\` for international patents
171
+ - Use \`bigquery-patent-search\` for full-text claims search
172
+ - Use \`patentsview-search-by-cpc\` for classification-based search
173
+ - Use \`odp-search-applications\` for pending applications
174
+
175
+ ### Step 3: Claim Analysis
176
+ For each potentially relevant patent:
177
+ - Use \`patentsview-get-claims\` or \`epo-get-claims\` to read claim language
178
+ - Map product features to claim elements
179
+ - Identify independent claims vs. dependent claims
180
+ - Assess literal infringement and doctrine of equivalents
181
+
182
+ ### Step 4: Patent Status
183
+ Verify each blocking patent is still enforceable:
184
+ - Use \`epo-legal-status\` for worldwide legal status
185
+ - Use \`odp-get-adjustment\` for patent term adjustment
186
+ - Check expiration dates and maintenance fee status
187
+ - Use \`odp-get-assignment\` for current ownership
188
+
189
+ ### Step 5: Family Analysis
190
+ For blocking patents, check global coverage:
191
+ - Use \`epo-family-lookup\` for INPADOC family members
192
+ - Identify all jurisdictions where protection exists
193
+ - Cross-reference with target markets
194
+
195
+ ### Step 6: Validity Assessment
196
+ Evaluate vulnerability of blocking patents:
197
+ - Use \`citations-get-enriched\` for prior art
198
+ - Use \`ptab-search-proceedings\` for post-grant challenges
199
+ - Use \`litigation-search\` for enforcement history
200
+
201
+ ### Step 7: Risk Assessment
202
+ Compile FTO opinion:
203
+ - High risk: active patents with claims covering product features
204
+ - Medium risk: patents with arguable coverage
205
+ - Low risk: expired, narrow, or likely invalid patents
206
+ - Recommend design-arounds or licensing strategies`}),e.addPrompt({name:`patent_landscape`,description:`Map the patent landscape for a technology area including key players, trends, and white spaces`,arguments:[{name:`technology_area`,description:`Technology area to map`,required:!0},{name:`cpc_codes`,description:`Relevant CPC codes (comma-separated)`,required:!1},{name:`date_range`,description:`Date range for analysis (e.g., 2020-2026)`,required:!1}],load:async e=>`# Patent Landscape: ${e.technology_area}
207
+
208
+ ${e.cpc_codes?`## CPC Codes: ${e.cpc_codes}\n`:``}
209
+ ${e.date_range?`## Date Range: ${e.date_range}\n`:``}
210
+
211
+ ## Landscape Mapping Workflow
212
+
213
+ ### Step 1: Define Technology Boundaries
214
+ - Identify relevant CPC/IPC classification codes
215
+ - Define key technical terms and synonyms
216
+ - Establish date range for analysis
217
+
218
+ ### Step 2: Quantitative Overview
219
+ - Use \`bigquery-cpc-analytics\` for filing statistics by CPC
220
+ - Use \`patentsview-search-by-cpc\` for US patent counts
221
+ - Track filing trends over time
222
+
223
+ ### Step 3: Key Players
224
+ - Use \`patentsview-search-assignees\` to identify top filers
225
+ - Use \`epo-search-patents\` with pa= for international filers
226
+ - Rank assignees by portfolio size and growth rate
227
+
228
+ ### Step 4: Technology Clusters
229
+ - Map sub-technology areas within the landscape
230
+ - Identify convergence of different technology streams
231
+ - Use CPC subclass analysis for granular breakdown
232
+
233
+ ### Step 5: Geographic Distribution
234
+ - Use \`epo-family-lookup\` to assess where patents are filed
235
+ - Map filing patterns by jurisdiction
236
+ - Identify jurisdiction-specific trends
237
+
238
+ ### Step 6: Citation Networks
239
+ - Use \`bigquery-citation-network\` for citation analysis
240
+ - Identify foundational patents (highly cited)
241
+ - Track knowledge flow between assignees
242
+
243
+ ### Step 7: White Space Analysis
244
+ - Identify under-patented areas within the technology
245
+ - Map areas with expiring patent coverage
246
+ - Highlight emerging technology areas with few filings
247
+
248
+ ### Step 8: Landscape Report
249
+ Compile landscape summary:
250
+ - Top assignees and their positions
251
+ - Technology trend analysis
252
+ - Geographic filing patterns
253
+ - White space opportunities
254
+ - Key patents to watch`})};export{e as registerPrompts};
255
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/prompts/index.ts"],"sourcesContent":["import type { FastMCP } from \"fastmcp\"\n\nexport const registerPrompts = (server: FastMCP): void => {\n server.addPrompt({\n name: \"prior_art_search\",\n description: \"Workflow for finding prior art across all available patent data sources\",\n arguments: [\n {\n name: \"invention_description\",\n description: \"Description of the invention or technology to search for\",\n required: true,\n },\n {\n name: \"key_terms\",\n description: \"Key technical terms and synonyms (comma-separated)\",\n required: false,\n },\n {\n name: \"cpc_codes\",\n description: \"Relevant CPC classification codes (comma-separated)\",\n required: false,\n },\n ],\n load: async (args) => {\n return `# Prior Art Search Workflow\n\n## Invention Description\n${args.invention_description}\n\n${args.key_terms ? `## Key Terms\\n${args.key_terms}\\n` : \"\"}\n${args.cpc_codes ? `## CPC Codes\\n${args.cpc_codes}\\n` : \"\"}\n\n## Search Strategy\n\n### Step 1: Keyword Search\nSearch across patent databases using key terms and synonyms:\n- Use \\`patentsview-search-patents\\` for US granted patents (full-text search)\n- Use \\`epo-search-patents\\` for international patents (CQL: ti/ab/ta fields)\n- Use \\`bigquery-patent-search\\` for full-text claims search at scale\n\n### Step 2: Classification Search\nSearch by CPC/IPC codes for relevant technology areas:\n- Use \\`patentsview-search-by-cpc\\` for US patents by CPC code\n- Use \\`epo-search-patents\\` with cpc= field for international coverage\n\n### Step 3: Assignee/Inventor Search\nIdentify key players and their patent portfolios:\n- Use \\`patentsview-search-assignees\\` to find relevant companies\n- Use \\`patentsview-search-inventors\\` to find key inventors\n\n### Step 4: Citation Analysis\nTrace citation networks from relevant patents found:\n- Use \\`citations-get-enriched\\` for enriched citation data\n- Use \\`bigquery-citation-network\\` for deeper citation graph analysis\n\n### Step 5: Family Analysis\nFor key prior art found, check international coverage:\n- Use \\`epo-family-lookup\\` for INPADOC family members\n- Use \\`epo-legal-status\\` to check if patents are still in force\n\n### Step 6: Review & Document\nCompile findings with patent numbers, key claims, and relevance assessment.`\n },\n })\n\n server.addPrompt({\n name: \"patent_validity\",\n description:\n \"Structured approach to analyzing patent validity including prior art, prosecution history, and claim construction\",\n arguments: [\n {\n name: \"patent_number\",\n description: \"Patent number to analyze\",\n required: true,\n },\n {\n name: \"claims_of_interest\",\n description: \"Specific claim numbers to focus on (comma-separated)\",\n required: false,\n },\n ],\n load: async (args) => {\n return `# Patent Validity Analysis: ${args.patent_number}\n\n${args.claims_of_interest ? `## Claims of Interest: ${args.claims_of_interest}\\n` : \"\"}\n\n## Analysis Workflow\n\n### Step 1: Patent Details\nRetrieve complete patent information:\n- Use \\`patentsview-get-patent\\` for bibliographic data\n- Use \\`patentsview-get-claims\\` or \\`epo-get-claims\\` for claim text\n- Use \\`patentsview-get-description\\` or \\`epo-get-description\\` for specification\n\n### Step 2: Prosecution History\nReview the patent's prosecution history:\n- Use \\`odp-get-transactions\\` for prosecution events\n- Use \\`office-action-get-text\\` for office action content\n- Use \\`office-action-get-rejections\\` for rejection details\n- Use \\`odp-get-continuity\\` for priority chain\n\n### Step 3: Prior Art Citations\nAnalyze cited prior art:\n- Use \\`citations-get-enriched\\` for citation data\n- Use \\`office-action-get-citations\\` for examiner-cited references\n- Use \\`citations-get-metrics\\` for citation impact\n\n### Step 4: PTAB Proceedings\nCheck for post-grant challenges:\n- Use \\`ptab-search-proceedings\\` with the patent number\n- Use \\`ptab-search-decisions\\` for related decisions\n\n### Step 5: Claim Construction\nAnalyze claim scope and limitations:\n- Review claim language from Step 1\n- Cross-reference with prosecution history amendments\n- Identify means-plus-function limitations\n\n### Step 6: Validity Assessment\nCompile validity analysis covering:\n- Novelty (35 USC 102) — prior art predating priority date\n- Obviousness (35 USC 103) — combinations of prior art\n- Written description (35 USC 112) — specification support\n- Prosecution history estoppel — narrowing amendments`\n },\n })\n\n server.addPrompt({\n name: \"competitor_portfolio\",\n description: \"Analyze a competitor's patent portfolio including trends, key technologies, and strategic insights\",\n arguments: [\n {\n name: \"company_name\",\n description: \"Name of the company to analyze\",\n required: true,\n },\n {\n name: \"technology_area\",\n description: \"Specific technology area to focus on (optional)\",\n required: false,\n },\n ],\n load: async (args) => {\n return `# Competitor Patent Portfolio Analysis: ${args.company_name}\n\n${args.technology_area ? `## Technology Focus: ${args.technology_area}\\n` : \"\"}\n\n## Analysis Workflow\n\n### Step 1: Identify Portfolio\nFind all patents assigned to the company:\n- Use \\`patentsview-search-assignees\\` to find disambiguated assignee ID\n- Use \\`patentsview-search-patents\\` with assignee filter\n- Use \\`epo-search-patents\\` with pa=\"${args.company_name}\" for international filings\n- Use \\`odp-search-applications\\` for pending US applications\n\n### Step 2: Technology Breakdown\nClassify the portfolio by technology area:\n- Use \\`patentsview-search-by-cpc\\` for CPC classification distribution\n- Use \\`bigquery-cpc-analytics\\` for statistical analysis\n- Identify core technology clusters\n\n### Step 3: Filing Trends\nAnalyze temporal patterns:\n- Track filing volumes over time\n- Identify emerging technology areas\n- Detect strategic shifts in R&D focus\n\n### Step 4: Key Patents\nIdentify the most important patents:\n- Use \\`citations-get-metrics\\` for highly-cited patents\n- Use \\`litigation-search\\` for patents involved in litigation\n- Use \\`ptab-search-proceedings\\` for challenged patents\n\n### Step 5: Geographic Coverage\nAssess worldwide patent strategy:\n- Use \\`epo-family-lookup\\` for family sizes\n- Use \\`epo-legal-status\\` for active jurisdictions\n- Map geographic protection strategy\n\n### Step 6: Strategic Assessment\nCompile portfolio insights:\n- Core vs. peripheral technology areas\n- Defensive vs. offensive patent strategy\n- White space opportunities\n- Potential licensing or acquisition targets`\n },\n })\n\n server.addPrompt({\n name: \"ptab_research\",\n description: \"Research PTAB proceedings (IPR/PGR/CBM) for a patent or technology area\",\n arguments: [\n {\n name: \"patent_number\",\n description: \"Patent number to research (optional if using query)\",\n required: false,\n },\n {\n name: \"query\",\n description: \"Search query for PTAB proceedings\",\n required: false,\n },\n ],\n load: async (args) => {\n return `# PTAB Research\n\n${args.patent_number ? `## Patent: ${args.patent_number}\\n` : \"\"}\n${args.query ? `## Query: ${args.query}\\n` : \"\"}\n\n## Research Workflow\n\n### Step 1: Find Proceedings\n- Use \\`ptab-search-proceedings\\` to find IPR/PGR/CBM proceedings\n- Filter by type (IPR, PGR, CBM) as needed\n- Check proceeding status (instituted, denied, settled, final written decision)\n\n### Step 2: Review Documents\nFor each relevant proceeding:\n- Use \\`ptab-get-proceeding\\` for proceeding details\n- Use \\`ptab-get-documents\\` for filed documents\n- Review petition, patent owner response, and institution decision\n\n### Step 3: Analyze Decisions\n- Use \\`ptab-search-decisions\\` for trial decisions\n- Use \\`ptab-get-decision\\` for detailed decision analysis\n- Track claim-by-claim outcomes\n\n### Step 4: Appeal History\n- Use \\`ptab-search-appeals\\` for ex parte appeal history\n- Use \\`ptab-get-appeal\\` for appeal details\n- Check Federal Circuit outcomes if applicable\n\n### Step 5: Impact Assessment\n- Which claims survived? Which were cancelled?\n- What prior art was most effective?\n- How does this affect the patent's enforceability?`\n },\n })\n\n server.addPrompt({\n name: \"freedom_to_operate\",\n description: \"FTO analysis methodology — identify patents that could block a product or technology\",\n arguments: [\n {\n name: \"product_description\",\n description: \"Description of the product or technology to assess\",\n required: true,\n },\n {\n name: \"target_markets\",\n description: \"Target jurisdictions/markets (comma-separated, e.g., US, EP, JP)\",\n required: false,\n },\n {\n name: \"key_features\",\n description: \"Key technical features of the product (comma-separated)\",\n required: false,\n },\n ],\n load: async (args) => {\n return `# Freedom to Operate Analysis\n\n## Product Description\n${args.product_description}\n\n${args.target_markets ? `## Target Markets: ${args.target_markets}\\n` : \"\"}\n${args.key_features ? `## Key Features: ${args.key_features}\\n` : \"\"}\n\n## FTO Methodology\n\n### Step 1: Define Scope\n- Identify key technical features of the product\n- Determine relevant CPC/IPC classification codes\n- Define target jurisdictions for analysis\n\n### Step 2: Patent Search\nComprehensive search for potentially blocking patents:\n- Use \\`patentsview-search-patents\\` for US patents\n- Use \\`epo-search-patents\\` for international patents\n- Use \\`bigquery-patent-search\\` for full-text claims search\n- Use \\`patentsview-search-by-cpc\\` for classification-based search\n- Use \\`odp-search-applications\\` for pending applications\n\n### Step 3: Claim Analysis\nFor each potentially relevant patent:\n- Use \\`patentsview-get-claims\\` or \\`epo-get-claims\\` to read claim language\n- Map product features to claim elements\n- Identify independent claims vs. dependent claims\n- Assess literal infringement and doctrine of equivalents\n\n### Step 4: Patent Status\nVerify each blocking patent is still enforceable:\n- Use \\`epo-legal-status\\` for worldwide legal status\n- Use \\`odp-get-adjustment\\` for patent term adjustment\n- Check expiration dates and maintenance fee status\n- Use \\`odp-get-assignment\\` for current ownership\n\n### Step 5: Family Analysis\nFor blocking patents, check global coverage:\n- Use \\`epo-family-lookup\\` for INPADOC family members\n- Identify all jurisdictions where protection exists\n- Cross-reference with target markets\n\n### Step 6: Validity Assessment\nEvaluate vulnerability of blocking patents:\n- Use \\`citations-get-enriched\\` for prior art\n- Use \\`ptab-search-proceedings\\` for post-grant challenges\n- Use \\`litigation-search\\` for enforcement history\n\n### Step 7: Risk Assessment\nCompile FTO opinion:\n- High risk: active patents with claims covering product features\n- Medium risk: patents with arguable coverage\n- Low risk: expired, narrow, or likely invalid patents\n- Recommend design-arounds or licensing strategies`\n },\n })\n\n server.addPrompt({\n name: \"patent_landscape\",\n description: \"Map the patent landscape for a technology area including key players, trends, and white spaces\",\n arguments: [\n {\n name: \"technology_area\",\n description: \"Technology area to map\",\n required: true,\n },\n {\n name: \"cpc_codes\",\n description: \"Relevant CPC codes (comma-separated)\",\n required: false,\n },\n {\n name: \"date_range\",\n description: \"Date range for analysis (e.g., 2020-2026)\",\n required: false,\n },\n ],\n load: async (args) => {\n return `# Patent Landscape: ${args.technology_area}\n\n${args.cpc_codes ? `## CPC Codes: ${args.cpc_codes}\\n` : \"\"}\n${args.date_range ? `## Date Range: ${args.date_range}\\n` : \"\"}\n\n## Landscape Mapping Workflow\n\n### Step 1: Define Technology Boundaries\n- Identify relevant CPC/IPC classification codes\n- Define key technical terms and synonyms\n- Establish date range for analysis\n\n### Step 2: Quantitative Overview\n- Use \\`bigquery-cpc-analytics\\` for filing statistics by CPC\n- Use \\`patentsview-search-by-cpc\\` for US patent counts\n- Track filing trends over time\n\n### Step 3: Key Players\n- Use \\`patentsview-search-assignees\\` to identify top filers\n- Use \\`epo-search-patents\\` with pa= for international filers\n- Rank assignees by portfolio size and growth rate\n\n### Step 4: Technology Clusters\n- Map sub-technology areas within the landscape\n- Identify convergence of different technology streams\n- Use CPC subclass analysis for granular breakdown\n\n### Step 5: Geographic Distribution\n- Use \\`epo-family-lookup\\` to assess where patents are filed\n- Map filing patterns by jurisdiction\n- Identify jurisdiction-specific trends\n\n### Step 6: Citation Networks\n- Use \\`bigquery-citation-network\\` for citation analysis\n- Identify foundational patents (highly cited)\n- Track knowledge flow between assignees\n\n### Step 7: White Space Analysis\n- Identify under-patented areas within the technology\n- Map areas with expiring patent coverage\n- Highlight emerging technology areas with few filings\n\n### Step 8: Landscape Report\nCompile landscape summary:\n- Top assignees and their positions\n- Technology trend analysis\n- Geographic filing patterns\n- White space opportunities\n- Key patents to watch`\n },\n })\n}\n"],"mappings":"AAEA,MAAa,EAAmB,GAA0B,CACxD,EAAO,UAAU,CACf,KAAM,mBACN,YAAa,0EACb,UAAW,CACT,CACE,KAAM,wBACN,YAAa,2DACb,SAAU,GACX,CACD,CACE,KAAM,YACN,YAAa,qDACb,SAAU,GACX,CACD,CACE,KAAM,YACN,YAAa,sDACb,SAAU,GACX,CACF,CACD,KAAM,KAAO,IACJ;;;EAGX,EAAK,sBAAsB;;EAE3B,EAAK,UAAY,iBAAiB,EAAK,UAAU,IAAM,GAAG;EAC1D,EAAK,UAAY,iBAAiB,EAAK,UAAU,IAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6EAiCzD,CAAC,CAEF,EAAO,UAAU,CACf,KAAM,kBACN,YACE,oHACF,UAAW,CACT,CACE,KAAM,gBACN,YAAa,2BACb,SAAU,GACX,CACD,CACE,KAAM,qBACN,YAAa,uDACb,SAAU,GACX,CACF,CACD,KAAM,KAAO,IACJ,+BAA+B,EAAK,cAAc;;EAE7D,EAAK,mBAAqB,0BAA0B,EAAK,mBAAmB,IAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uDAyCpF,CAAC,CAEF,EAAO,UAAU,CACf,KAAM,uBACN,YAAa,qGACb,UAAW,CACT,CACE,KAAM,eACN,YAAa,iCACb,SAAU,GACX,CACD,CACE,KAAM,kBACN,YAAa,kDACb,SAAU,GACX,CACF,CACD,KAAM,KAAO,IACJ,2CAA2C,EAAK,aAAa;;EAExE,EAAK,gBAAkB,wBAAwB,EAAK,gBAAgB,IAAM,GAAG;;;;;;;;wCAQvC,EAAK,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8CAkCvD,CAAC,CAEF,EAAO,UAAU,CACf,KAAM,gBACN,YAAa,0EACb,UAAW,CACT,CACE,KAAM,gBACN,YAAa,sDACb,SAAU,GACX,CACD,CACE,KAAM,QACN,YAAa,oCACb,SAAU,GACX,CACF,CACD,KAAM,KAAO,IACJ;;EAEX,EAAK,cAAgB,cAAc,EAAK,cAAc,IAAM,GAAG;EAC/D,EAAK,MAAQ,aAAa,EAAK,MAAM,IAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;qDA8B7C,CAAC,CAEF,EAAO,UAAU,CACf,KAAM,qBACN,YAAa,uFACb,UAAW,CACT,CACE,KAAM,sBACN,YAAa,qDACb,SAAU,GACX,CACD,CACE,KAAM,iBACN,YAAa,mEACb,SAAU,GACX,CACD,CACE,KAAM,eACN,YAAa,0DACb,SAAU,GACX,CACF,CACD,KAAM,KAAO,IACJ;;;EAGX,EAAK,oBAAoB;;EAEzB,EAAK,eAAiB,sBAAsB,EAAK,eAAe,IAAM,GAAG;EACzE,EAAK,aAAe,oBAAoB,EAAK,aAAa,IAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oDAkDlE,CAAC,CAEF,EAAO,UAAU,CACf,KAAM,mBACN,YAAa,iGACb,UAAW,CACT,CACE,KAAM,kBACN,YAAa,yBACb,SAAU,GACX,CACD,CACE,KAAM,YACN,YAAa,uCACb,SAAU,GACX,CACD,CACE,KAAM,aACN,YAAa,4CACb,SAAU,GACX,CACF,CACD,KAAM,KAAO,IACJ,uBAAuB,EAAK,gBAAgB;;EAEvD,EAAK,UAAY,iBAAiB,EAAK,UAAU,IAAM,GAAG;EAC1D,EAAK,WAAa,kBAAkB,EAAK,WAAW,IAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBA+C5D,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { FastMCP } from "fastmcp";
2
+
3
+ //#region src/resources/index.d.ts
4
+ declare const registerResources: (server: FastMCP) => void;
5
+ //#endregion
6
+ export { registerResources };
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,44 @@
1
+ const e={30:`Docketed New Case - Ready for Examination`,40:`Non Final Action Mailed`,41:`Non Final Action - Loss of Right to Respond`,60:`Final Rejection Mailed`,61:`Final Rejection - Loss of Right to Respond`,71:`Response After Final Action Forwarded to Examiner`,100:`Request for Prioritized Examination`,110:`RCE Filed`,120:`Case Reopened After Allowance`,150:`Patent Granted`,161:`Patent Expired Due to NonPayment of Maintenance Fees`,250:`Application Disposed of / Abandoned`,500:`Notice of Allowance Mailed`,600:`Appeal - Awaiting Decision`,700:`Interference Proceeding`,800:`Interference Proceeding - Patent Case`,900:`Petition Granted`},t=t=>{t.addResourceTemplate({uriTemplate:`patents://cpc/{code}`,name:`CPC Classification`,description:`Look up CPC (Cooperative Patent Classification) code information`,mimeType:`application/json`,arguments:[{name:`code`,description:`CPC classification code (e.g., A61K, C07D487/04)`,required:!0}],load:async e=>({text:JSON.stringify({code:e.code,note:`Use get-cpc-info tool or patentsview-lookup-cpc for detailed CPC information`,sections:{A:`Human Necessities`,B:`Performing Operations; Transporting`,C:`Chemistry; Metallurgy`,D:`Textiles; Paper`,E:`Fixed Constructions`,F:`Mechanical Engineering; Lighting; Heating; Weapons; Blasting`,G:`Physics`,H:`Electricity`,Y:`General Tagging of New Technological Developments`}},null,2)})}),t.addResource({uri:`patents://status-codes`,name:`USPTO Status Codes`,description:`USPTO application status code definitions`,mimeType:`application/json`,load:async()=>({text:JSON.stringify(e,null,2)})}),t.addResource({uri:`patents://sources`,name:`Patent Data Sources`,description:`Overview of all patent data sources available through this server`,mimeType:`text/markdown`,load:async()=>({text:`# Patent Data Sources
2
+
3
+ ## PatentsView (search.patentsview.org)
4
+ - **Coverage**: Granted US patents 1976–present, pre-grant publications 2001–present
5
+ - **Strengths**: Full-text search, disambiguated entities (assignees, inventors, attorneys)
6
+ - **Auth**: Optional API key (key grants suspended March 2026)
7
+ - **Rate limit**: 45 req/min
8
+ - **Note**: Migrating to USPTO Open Data Portal (ODP). May return 403 after March 20, 2026.
9
+
10
+ ## USPTO Open Data Portal - ODP (api.uspto.gov)
11
+ - **Coverage**: Patent applications filed January 1, 2001+
12
+ - **Strengths**: Official USPTO data, prosecution history, assignments, continuity
13
+ - **Auth**: API key required (x-api-key header)
14
+ - **Rate limit**: 60 req/min, 4 req/min for downloads
15
+ - **Includes**: PTAB proceedings (v3), litigation data, office actions
16
+
17
+ ## EPO Open Patent Services - OPS (ops.epo.org)
18
+ - **Coverage**: Worldwide patent data, ~100M+ documents
19
+ - **Strengths**: INPADOC patent families, legal status across ~44 offices, full-text claims/descriptions
20
+ - **Auth**: OAuth 2.0 client credentials (register at developers.epo.org)
21
+ - **Rate limit**: Traffic light system (Green/Yellow/Red/Black)
22
+ - **Free tier**: ~3.5 GB/week
23
+ - **Query**: CQL syntax (ti, ab, pa, in, pn, cpc, pd fields)
24
+
25
+ ## Google Patents BigQuery (patents-public-data)
26
+ - **Coverage**: 90M+ patent documents worldwide
27
+ - **Strengths**: Full-text SQL search across claims/abstracts, citation networks, analytics
28
+ - **Auth**: GCP service account
29
+ - **Free tier**: 1 TB/month query processing, then $5/TB
30
+ - **Note**: Always uses dryRun to estimate cost before executing queries
31
+
32
+ ## PTAB (via ODP)
33
+ - **Coverage**: IPR, PGR, CBM proceedings and ex parte appeals
34
+ - **Strengths**: Trial documents, decisions, institution records
35
+ - **Auth**: Same as ODP (API key)
36
+
37
+ ## Litigation (via ODP)
38
+ - **Coverage**: 74K+ patent litigation cases
39
+ - **Strengths**: Case details, parties, courts, outcomes
40
+
41
+ ## Office Actions (migrating to ODP)
42
+ - **Coverage**: USPTO office actions
43
+ - **Strengths**: Rejection text, examiner citations, response history`})}),t.addResource({uri:`patents://search-syntax`,name:`Search Syntax Guide`,description:`Query syntax guide for PatentsView, EPO CQL, ODP, and BigQuery`,mimeType:`text/markdown`,load:async()=>({text:'# Patent Search Syntax Guide\n\n## PatentsView Query Format\nPatentsView uses a JSON query format with q/f/s/o parameters:\n\n### Query operators (q):\n- `{"_text_any": {"patent_abstract": "drug delivery"}}` — text search\n- `{"_eq": {"patent_number": "11646472"}}` — exact match\n- `{"_begins": {"cpc_group_id": "A61K"}}` — prefix match\n- `{"_and": [{...}, {...}]}` — combine conditions\n- `{"_or": [{...}, {...}]}` — alternative conditions\n\n### Fields (f): Array of field names to return\n### Sort (s): Array of {field: "asc"|"desc"} objects\n### Options (o): {"limit": 25, "offset": 0}\n\n## EPO CQL (Contextual Query Language)\nUsed with epo-search-patents tool:\n\n### Fields:\n- `ti` — Title: `ti="antibody drug conjugate"`\n- `ab` — Abstract: `ab=metarrestin`\n- `ta` — Title + Abstract: `ta=perinucleolar`\n- `pa` — Applicant: `pa="Northwestern University"`\n- `in` — Inventor: `in="Sui Huang"`\n- `pn` — Publication number: `pn=US10301314`\n- `cpc` — CPC code: `cpc=C07D487/04`\n- `pd` — Publication date: `pd>=20200101`\n\n### Operators: AND, OR, NOT\n### Truncation: * (multi-char), ? (single-char)\n### Limits: Max 10 query terms, max 2000 results per query\n\n## USPTO ODP\nODP uses simple text search:\n- `searchText` parameter with free-text query\n- Patent number formats: 17248024, 17/248,024, US 17/248,024, US-11646472-B2\n\n## Google BigQuery SQL\nStandard SQL against patents-public-data.patents.publications:\n- Full-text: `WHERE SEARCH(abstract_localized.text, \'metarrestin\')`\n- CPC: `CROSS JOIN UNNEST(cpc) AS c WHERE c.code LIKE \'A61K%\'`\n- Claims: `CROSS JOIN UNNEST(claims_localized) AS cl WHERE SEARCH(cl.text, \'antibody\')`\n- Date: `WHERE publication_date >= 20200101`\n- Publication number in DOCDB format: US-7650331-B1'})})};export{t as registerResources};
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/resources/index.ts"],"sourcesContent":["import type { FastMCP } from \"fastmcp\"\n\nconst STATUS_CODES: Record<string, string> = {\n \"30\": \"Docketed New Case - Ready for Examination\",\n \"40\": \"Non Final Action Mailed\",\n \"41\": \"Non Final Action - Loss of Right to Respond\",\n \"60\": \"Final Rejection Mailed\",\n \"61\": \"Final Rejection - Loss of Right to Respond\",\n \"71\": \"Response After Final Action Forwarded to Examiner\",\n \"100\": \"Request for Prioritized Examination\",\n \"110\": \"RCE Filed\",\n \"120\": \"Case Reopened After Allowance\",\n \"150\": \"Patent Granted\",\n \"161\": \"Patent Expired Due to NonPayment of Maintenance Fees\",\n \"250\": \"Application Disposed of / Abandoned\",\n \"500\": \"Notice of Allowance Mailed\",\n \"600\": \"Appeal - Awaiting Decision\",\n \"700\": \"Interference Proceeding\",\n \"800\": \"Interference Proceeding - Patent Case\",\n \"900\": \"Petition Granted\",\n}\n\nconst SOURCES_DESCRIPTION = `# Patent Data Sources\n\n## PatentsView (search.patentsview.org)\n- **Coverage**: Granted US patents 1976–present, pre-grant publications 2001–present\n- **Strengths**: Full-text search, disambiguated entities (assignees, inventors, attorneys)\n- **Auth**: Optional API key (key grants suspended March 2026)\n- **Rate limit**: 45 req/min\n- **Note**: Migrating to USPTO Open Data Portal (ODP). May return 403 after March 20, 2026.\n\n## USPTO Open Data Portal - ODP (api.uspto.gov)\n- **Coverage**: Patent applications filed January 1, 2001+\n- **Strengths**: Official USPTO data, prosecution history, assignments, continuity\n- **Auth**: API key required (x-api-key header)\n- **Rate limit**: 60 req/min, 4 req/min for downloads\n- **Includes**: PTAB proceedings (v3), litigation data, office actions\n\n## EPO Open Patent Services - OPS (ops.epo.org)\n- **Coverage**: Worldwide patent data, ~100M+ documents\n- **Strengths**: INPADOC patent families, legal status across ~44 offices, full-text claims/descriptions\n- **Auth**: OAuth 2.0 client credentials (register at developers.epo.org)\n- **Rate limit**: Traffic light system (Green/Yellow/Red/Black)\n- **Free tier**: ~3.5 GB/week\n- **Query**: CQL syntax (ti, ab, pa, in, pn, cpc, pd fields)\n\n## Google Patents BigQuery (patents-public-data)\n- **Coverage**: 90M+ patent documents worldwide\n- **Strengths**: Full-text SQL search across claims/abstracts, citation networks, analytics\n- **Auth**: GCP service account\n- **Free tier**: 1 TB/month query processing, then $5/TB\n- **Note**: Always uses dryRun to estimate cost before executing queries\n\n## PTAB (via ODP)\n- **Coverage**: IPR, PGR, CBM proceedings and ex parte appeals\n- **Strengths**: Trial documents, decisions, institution records\n- **Auth**: Same as ODP (API key)\n\n## Litigation (via ODP)\n- **Coverage**: 74K+ patent litigation cases\n- **Strengths**: Case details, parties, courts, outcomes\n\n## Office Actions (migrating to ODP)\n- **Coverage**: USPTO office actions\n- **Strengths**: Rejection text, examiner citations, response history`\n\nconst SEARCH_SYNTAX = `# Patent Search Syntax Guide\n\n## PatentsView Query Format\nPatentsView uses a JSON query format with q/f/s/o parameters:\n\n### Query operators (q):\n- \\`{\"_text_any\": {\"patent_abstract\": \"drug delivery\"}}\\` — text search\n- \\`{\"_eq\": {\"patent_number\": \"11646472\"}}\\` — exact match\n- \\`{\"_begins\": {\"cpc_group_id\": \"A61K\"}}\\` — prefix match\n- \\`{\"_and\": [{...}, {...}]}\\` — combine conditions\n- \\`{\"_or\": [{...}, {...}]}\\` — alternative conditions\n\n### Fields (f): Array of field names to return\n### Sort (s): Array of {field: \"asc\"|\"desc\"} objects\n### Options (o): {\"limit\": 25, \"offset\": 0}\n\n## EPO CQL (Contextual Query Language)\nUsed with epo-search-patents tool:\n\n### Fields:\n- \\`ti\\` — Title: \\`ti=\"antibody drug conjugate\"\\`\n- \\`ab\\` — Abstract: \\`ab=metarrestin\\`\n- \\`ta\\` — Title + Abstract: \\`ta=perinucleolar\\`\n- \\`pa\\` — Applicant: \\`pa=\"Northwestern University\"\\`\n- \\`in\\` — Inventor: \\`in=\"Sui Huang\"\\`\n- \\`pn\\` — Publication number: \\`pn=US10301314\\`\n- \\`cpc\\` — CPC code: \\`cpc=C07D487/04\\`\n- \\`pd\\` — Publication date: \\`pd>=20200101\\`\n\n### Operators: AND, OR, NOT\n### Truncation: * (multi-char), ? (single-char)\n### Limits: Max 10 query terms, max 2000 results per query\n\n## USPTO ODP\nODP uses simple text search:\n- \\`searchText\\` parameter with free-text query\n- Patent number formats: 17248024, 17/248,024, US 17/248,024, US-11646472-B2\n\n## Google BigQuery SQL\nStandard SQL against patents-public-data.patents.publications:\n- Full-text: \\`WHERE SEARCH(abstract_localized.text, 'metarrestin')\\`\n- CPC: \\`CROSS JOIN UNNEST(cpc) AS c WHERE c.code LIKE 'A61K%'\\`\n- Claims: \\`CROSS JOIN UNNEST(claims_localized) AS cl WHERE SEARCH(cl.text, 'antibody')\\`\n- Date: \\`WHERE publication_date >= 20200101\\`\n- Publication number in DOCDB format: US-7650331-B1`\n\nexport const registerResources = (server: FastMCP): void => {\n server.addResourceTemplate({\n uriTemplate: \"patents://cpc/{code}\",\n name: \"CPC Classification\",\n description: \"Look up CPC (Cooperative Patent Classification) code information\",\n mimeType: \"application/json\",\n arguments: [\n {\n name: \"code\",\n description: \"CPC classification code (e.g., A61K, C07D487/04)\",\n required: true,\n },\n ],\n load: async (args) => {\n return {\n text: JSON.stringify(\n {\n code: args.code,\n note: \"Use get-cpc-info tool or patentsview-lookup-cpc for detailed CPC information\",\n sections: {\n A: \"Human Necessities\",\n B: \"Performing Operations; Transporting\",\n C: \"Chemistry; Metallurgy\",\n D: \"Textiles; Paper\",\n E: \"Fixed Constructions\",\n F: \"Mechanical Engineering; Lighting; Heating; Weapons; Blasting\",\n G: \"Physics\",\n H: \"Electricity\",\n Y: \"General Tagging of New Technological Developments\",\n },\n },\n null,\n 2,\n ),\n }\n },\n })\n\n server.addResource({\n uri: \"patents://status-codes\",\n name: \"USPTO Status Codes\",\n description: \"USPTO application status code definitions\",\n mimeType: \"application/json\",\n load: async () => ({\n text: JSON.stringify(STATUS_CODES, null, 2),\n }),\n })\n\n server.addResource({\n uri: \"patents://sources\",\n name: \"Patent Data Sources\",\n description: \"Overview of all patent data sources available through this server\",\n mimeType: \"text/markdown\",\n load: async () => ({\n text: SOURCES_DESCRIPTION,\n }),\n })\n\n server.addResource({\n uri: \"patents://search-syntax\",\n name: \"Search Syntax Guide\",\n description: \"Query syntax guide for PatentsView, EPO CQL, ODP, and BigQuery\",\n mimeType: \"text/markdown\",\n load: async () => ({\n text: SEARCH_SYNTAX,\n }),\n })\n}\n"],"mappings":"AAEA,MAAM,EAAuC,CAC3C,GAAM,4CACN,GAAM,0BACN,GAAM,8CACN,GAAM,yBACN,GAAM,6CACN,GAAM,oDACN,IAAO,sCACP,IAAO,YACP,IAAO,gCACP,IAAO,iBACP,IAAO,uDACP,IAAO,sCACP,IAAO,6BACP,IAAO,6BACP,IAAO,0BACP,IAAO,wCACP,IAAO,mBACR,CA4FY,EAAqB,GAA0B,CAC1D,EAAO,oBAAoB,CACzB,YAAa,uBACb,KAAM,qBACN,YAAa,mEACb,SAAU,mBACV,UAAW,CACT,CACE,KAAM,OACN,YAAa,mDACb,SAAU,GACX,CACF,CACD,KAAM,KAAO,KACJ,CACL,KAAM,KAAK,UACT,CACE,KAAM,EAAK,KACX,KAAM,+EACN,SAAU,CACR,EAAG,oBACH,EAAG,sCACH,EAAG,wBACH,EAAG,kBACH,EAAG,sBACH,EAAG,+DACH,EAAG,UACH,EAAG,cACH,EAAG,oDACJ,CACF,CACD,KACA,EACD,CACF,EAEJ,CAAC,CAEF,EAAO,YAAY,CACjB,IAAK,yBACL,KAAM,qBACN,YAAa,4CACb,SAAU,mBACV,KAAM,UAAa,CACjB,KAAM,KAAK,UAAU,EAAc,KAAM,EAAE,CAC5C,EACF,CAAC,CAEF,EAAO,YAAY,CACjB,IAAK,oBACL,KAAM,sBACN,YAAa,oEACb,SAAU,gBACV,KAAM,UAAa,CACjB,KAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uEACP,EACF,CAAC,CAEF,EAAO,YAAY,CACjB,IAAK,0BACL,KAAM,sBACN,YAAa,iEACb,SAAU,gBACV,KAAM,UAAa,CACjB,KAAM,muDACP,EACF,CAAC"}
@@ -0,0 +1,8 @@
1
+ import * as fastmcp from "fastmcp";
2
+ import { FastMCP } from "fastmcp";
3
+
4
+ //#region src/server.d.ts
5
+ declare const server: FastMCP<fastmcp.FastMCPSessionAuth>;
6
+ //#endregion
7
+ export { server };
8
+ //# sourceMappingURL=server.d.ts.map
package/dist/server.js ADDED
@@ -0,0 +1,2 @@
1
+ import{FastMCP as e}from"fastmcp";const t=new e({name:`patents-mcp-server`,version:`1.0.0`});export{t as server};
2
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","names":[],"sources":["../src/server.ts"],"sourcesContent":["import { FastMCP } from \"fastmcp\"\n\nexport const server = new FastMCP({\n name: \"patents-mcp-server\",\n version: \"1.0.0\",\n})\n"],"mappings":"kCAEA,MAAa,EAAS,IAAI,EAAQ,CAChC,KAAM,qBACN,QAAS,QACV,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { FastMCP } from "fastmcp";
2
+
3
+ //#region src/tools/bigquery.tools.d.ts
4
+ declare const registerBigQueryTools: (server: FastMCP) => void;
5
+ //#endregion
6
+ export { registerBigQueryTools };
7
+ //# sourceMappingURL=bigquery.tools.d.ts.map
@@ -0,0 +1,14 @@
1
+ import{bigqueryCitationNetwork as e,bigqueryCpcAnalytics as t,bigqueryPatentFamily as n,bigqueryPatentSearch as r}from"../clients/bigquery.client.js";import{handleApiError as i}from"../lib/errors.js";import{z as a}from"zod";const o={readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},s=s=>{s.addTool({name:`bigquery-patent-search`,description:`Full-text search across 90M+ patent documents in Google Patents Public Data (BigQuery).
2
+ Searches title and abstract fields. Returns publication number, title, abstract, date, and assignees.
3
+ Cost estimate is included in every response. Free tier: 1 TB/month.
4
+
5
+ Use this for broad full-text patent search, especially when you need to search across claims text
6
+ or when PatentsView/EPO results are insufficient.`,parameters:a.object({query:a.string().describe(`Search terms to find in patent titles and abstracts`),fields:a.array(a.string()).optional().describe(`Fields to return (default: publication_number, title_localized, abstract_localized, publication_date, assignee_harmonized)`),limit:a.number().min(1).max(100).default(25).describe(`Maximum results to return`)}),annotations:o,execute:async e=>{try{let t=await r(e.query,e.fields,e.limit);return JSON.stringify(t,null,2)}catch(e){return i(e)}}}),s.addTool({name:`bigquery-patent-family`,description:`Get all patent family members by INPADOC family ID from Google Patents BigQuery.
7
+ Returns all publications sharing the same family ID with country, title, dates.
8
+ Complements epo-family-lookup with BigQuery's comprehensive dataset.`,parameters:a.object({family_id:a.string().describe(`INPADOC family ID to look up`)}),annotations:o,execute:async e=>{try{let t=await n(e.family_id);return JSON.stringify(t,null,2)}catch(e){return i(e)}}}),s.addTool({name:`bigquery-citation-network`,description:`Build a citation graph for a patent from Google Patents BigQuery.
9
+ Returns all patents cited by the given patent (depth=1) or citations-of-citations (depth=2).
10
+ Publication numbers in DOCDB format (e.g., US-7650331-B1).
11
+ Useful for prior art analysis and understanding technology lineage.`,parameters:a.object({publication_number:a.string().describe(`Publication number in DOCDB format (e.g., US-7650331-B1)`),depth:a.number().min(1).max(2).default(1).describe(`Citation depth: 1 for direct citations, 2 for citations-of-citations`)}),annotations:o,execute:async t=>{try{let n=await e(t.publication_number,t.depth);return JSON.stringify(n,null,2)}catch(e){return i(e)}}}),s.addTool({name:`bigquery-cpc-analytics`,description:`Patent filing statistics by CPC classification from Google Patents BigQuery.
12
+ Returns patent counts, unique assignees, and date ranges for each CPC code matching the prefix.
13
+ Useful for patent landscape analysis and identifying trends in technology areas.`,parameters:a.object({cpc_prefix:a.string().describe(`CPC code prefix to analyze (e.g., A61K for pharmaceuticals, C07D487 for specific compounds)`),date_from:a.string().optional().describe(`Start date filter (YYYYMMDD format, e.g., 20200101)`),date_to:a.string().optional().describe(`End date filter (YYYYMMDD format, e.g., 20261231)`)}),annotations:o,execute:async e=>{try{let n=await t(e.cpc_prefix,e.date_from,e.date_to);return JSON.stringify(n,null,2)}catch(e){return i(e)}}})};export{s as registerBigQueryTools};
14
+ //# sourceMappingURL=bigquery.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bigquery.tools.js","names":[],"sources":["../../src/tools/bigquery.tools.ts"],"sourcesContent":["import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport {\n bigqueryCitationNetwork,\n bigqueryCpcAnalytics,\n bigqueryPatentFamily,\n bigqueryPatentSearch,\n} from \"../clients/bigquery.client\"\nimport { handleApiError } from \"../lib/errors\"\n\nconst readOnlyAnnotations = {\n readOnlyHint: true as const,\n destructiveHint: false as const,\n idempotentHint: true as const,\n openWorldHint: true as const,\n}\n\nexport const registerBigQueryTools = (server: FastMCP): void => {\n server.addTool({\n name: \"bigquery-patent-search\",\n description: `Full-text search across 90M+ patent documents in Google Patents Public Data (BigQuery).\nSearches title and abstract fields. Returns publication number, title, abstract, date, and assignees.\nCost estimate is included in every response. Free tier: 1 TB/month.\n\nUse this for broad full-text patent search, especially when you need to search across claims text\nor when PatentsView/EPO results are insufficient.`,\n parameters: z.object({\n query: z.string().describe(\"Search terms to find in patent titles and abstracts\"),\n fields: z\n .array(z.string())\n .optional()\n .describe(\n \"Fields to return (default: publication_number, title_localized, abstract_localized, publication_date, assignee_harmonized)\",\n ),\n limit: z.number().min(1).max(100).default(25).describe(\"Maximum results to return\"),\n }),\n annotations: readOnlyAnnotations,\n execute: async (args) => {\n try {\n const result = await bigqueryPatentSearch(args.query, args.fields, args.limit)\n return JSON.stringify(result, null, 2)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"bigquery-patent-family\",\n description: `Get all patent family members by INPADOC family ID from Google Patents BigQuery.\nReturns all publications sharing the same family ID with country, title, dates.\nComplements epo-family-lookup with BigQuery's comprehensive dataset.`,\n parameters: z.object({\n family_id: z.string().describe(\"INPADOC family ID to look up\"),\n }),\n annotations: readOnlyAnnotations,\n execute: async (args) => {\n try {\n const result = await bigqueryPatentFamily(args.family_id)\n return JSON.stringify(result, null, 2)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"bigquery-citation-network\",\n description: `Build a citation graph for a patent from Google Patents BigQuery.\nReturns all patents cited by the given patent (depth=1) or citations-of-citations (depth=2).\nPublication numbers in DOCDB format (e.g., US-7650331-B1).\nUseful for prior art analysis and understanding technology lineage.`,\n parameters: z.object({\n publication_number: z.string().describe(\"Publication number in DOCDB format (e.g., US-7650331-B1)\"),\n depth: z\n .number()\n .min(1)\n .max(2)\n .default(1)\n .describe(\"Citation depth: 1 for direct citations, 2 for citations-of-citations\"),\n }),\n annotations: readOnlyAnnotations,\n execute: async (args) => {\n try {\n const result = await bigqueryCitationNetwork(args.publication_number, args.depth)\n return JSON.stringify(result, null, 2)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"bigquery-cpc-analytics\",\n description: `Patent filing statistics by CPC classification from Google Patents BigQuery.\nReturns patent counts, unique assignees, and date ranges for each CPC code matching the prefix.\nUseful for patent landscape analysis and identifying trends in technology areas.`,\n parameters: z.object({\n cpc_prefix: z\n .string()\n .describe(\"CPC code prefix to analyze (e.g., A61K for pharmaceuticals, C07D487 for specific compounds)\"),\n date_from: z.string().optional().describe(\"Start date filter (YYYYMMDD format, e.g., 20200101)\"),\n date_to: z.string().optional().describe(\"End date filter (YYYYMMDD format, e.g., 20261231)\"),\n }),\n annotations: readOnlyAnnotations,\n execute: async (args) => {\n try {\n const result = await bigqueryCpcAnalytics(args.cpc_prefix, args.date_from, args.date_to)\n return JSON.stringify(result, null, 2)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n}\n"],"mappings":"gOAWA,MAAM,EAAsB,CAC1B,aAAc,GACd,gBAAiB,GACjB,eAAgB,GAChB,cAAe,GAChB,CAEY,EAAyB,GAA0B,CAC9D,EAAO,QAAQ,CACb,KAAM,yBACN,YAAa;;;;;mDAMb,WAAY,EAAE,OAAO,CACnB,MAAO,EAAE,QAAQ,CAAC,SAAS,sDAAsD,CACjF,OAAQ,EACL,MAAM,EAAE,QAAQ,CAAC,CACjB,UAAU,CACV,SACC,6HACD,CACH,MAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,SAAS,4BAA4B,CACpF,CAAC,CACF,YAAa,EACb,QAAS,KAAO,IAAS,CACvB,GAAI,CACF,IAAM,EAAS,MAAM,EAAqB,EAAK,MAAO,EAAK,OAAQ,EAAK,MAAM,CAC9E,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,OAC/B,EAAO,CACd,OAAO,EAAe,EAAM,GAGjC,CAAC,CAEF,EAAO,QAAQ,CACb,KAAM,yBACN,YAAa;;sEAGb,WAAY,EAAE,OAAO,CACnB,UAAW,EAAE,QAAQ,CAAC,SAAS,+BAA+B,CAC/D,CAAC,CACF,YAAa,EACb,QAAS,KAAO,IAAS,CACvB,GAAI,CACF,IAAM,EAAS,MAAM,EAAqB,EAAK,UAAU,CACzD,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,OAC/B,EAAO,CACd,OAAO,EAAe,EAAM,GAGjC,CAAC,CAEF,EAAO,QAAQ,CACb,KAAM,4BACN,YAAa;;;qEAIb,WAAY,EAAE,OAAO,CACnB,mBAAoB,EAAE,QAAQ,CAAC,SAAS,2DAA2D,CACnG,MAAO,EACJ,QAAQ,CACR,IAAI,EAAE,CACN,IAAI,EAAE,CACN,QAAQ,EAAE,CACV,SAAS,uEAAuE,CACpF,CAAC,CACF,YAAa,EACb,QAAS,KAAO,IAAS,CACvB,GAAI,CACF,IAAM,EAAS,MAAM,EAAwB,EAAK,mBAAoB,EAAK,MAAM,CACjF,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,OAC/B,EAAO,CACd,OAAO,EAAe,EAAM,GAGjC,CAAC,CAEF,EAAO,QAAQ,CACb,KAAM,yBACN,YAAa;;kFAGb,WAAY,EAAE,OAAO,CACnB,WAAY,EACT,QAAQ,CACR,SAAS,8FAA8F,CAC1G,UAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,sDAAsD,CAChG,QAAS,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,oDAAoD,CAC7F,CAAC,CACF,YAAa,EACb,QAAS,KAAO,IAAS,CACvB,GAAI,CACF,IAAM,EAAS,MAAM,EAAqB,EAAK,WAAY,EAAK,UAAW,EAAK,QAAQ,CACxF,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,OAC/B,EAAO,CACd,OAAO,EAAe,EAAM,GAGjC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { FastMCP } from "fastmcp";
2
+
3
+ //#region src/tools/citations.tools.d.ts
4
+ declare const registerCitationsTools: (server: FastMCP) => void;
5
+ //#endregion
6
+ export { registerCitationsTools };
7
+ //# sourceMappingURL=citations.tools.d.ts.map
@@ -0,0 +1,2 @@
1
+ import{config as e}from"../lib/config.js";import{handleApiError as t}from"../lib/errors.js";import"../base.client-zZnUjoIb.js";import{OdpClient as n}from"../clients/odp.client.js";import{z as r}from"zod";const i={readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},a=()=>new n({apiKey:e.usptoApiKey??(()=>{throw Error(`USPTO_API_KEY is required`)})(),timeout:e.requestTimeout}),o=e=>{e.addTool({name:`citations-get-enriched`,description:`Get enriched citation data for a patent, including forward and backward citations with metadata about cited/citing patents.`,parameters:r.object({patentNumber:r.string().describe(`Patent number (e.g., US10123456 or 10123456)`)}),annotations:i,execute:async e=>{try{let t=await a().getEnrichedCitations(e.patentNumber);return JSON.stringify(t)}catch(e){return t(e)}}}),e.addTool({name:`citations-search`,description:`Search patent citations across the USPTO database.`,parameters:r.object({query:r.string().describe(`Search query for citations`),limit:r.number().int().min(1).max(100).default(25).describe(`Number of results to return (1-100)`)}),annotations:i,execute:async e=>{try{let t=await a().searchCitations(e.query,e.limit);return JSON.stringify(t)}catch(e){return t(e)}}}),e.addTool({name:`citations-get-metrics`,description:`Get citation metrics for a patent including citation counts, citation velocity, and influence scores.`,parameters:r.object({patentNumber:r.string().describe(`Patent number (e.g., US10123456 or 10123456)`)}),annotations:i,execute:async e=>{try{let t=await a().getCitationMetrics(e.patentNumber);return JSON.stringify(t)}catch(e){return t(e)}}}),e.addTool({name:`litigation-search`,description:`Search patent litigation cases. Filter by plaintiff, defendant, patent number, court, and date range.`,parameters:r.object({query:r.string().optional().describe(`Search query text`),plaintiff:r.string().optional().describe(`Plaintiff name filter`),defendant:r.string().optional().describe(`Defendant name filter`),patent_number:r.string().optional().describe(`Patent number filter`),court:r.string().optional().describe(`Court name filter`),date_from:r.string().optional().describe(`Start date filter (YYYY-MM-DD)`),date_to:r.string().optional().describe(`End date filter (YYYY-MM-DD)`),limit:r.number().int().min(1).max(100).default(25).describe(`Number of results to return (1-100)`)}),annotations:i,execute:async e=>{try{let t=await a().searchLitigation({query:e.query,plaintiff:e.plaintiff,defendant:e.defendant,patent_number:e.patent_number,court:e.court,date_from:e.date_from,date_to:e.date_to,limit:e.limit});return JSON.stringify(t)}catch(e){return t(e)}}}),e.addTool({name:`litigation-get-case`,description:`Get detailed information about a specific patent litigation case.`,parameters:r.object({caseId:r.string().describe(`Litigation case identifier`)}),annotations:i,execute:async e=>{try{let t=await a().getLitigationCase(e.caseId);return JSON.stringify(t)}catch(e){return t(e)}}}),e.addTool({name:`litigation-get-patent`,description:`Get all litigation cases involving a specific patent.`,parameters:r.object({patentNumber:r.string().describe(`Patent number (e.g., US10123456 or 10123456)`)}),annotations:i,execute:async e=>{try{let t=await a().getLitigationByPatent(e.patentNumber);return JSON.stringify(t)}catch(e){return t(e)}}})};export{o as registerCitationsTools};
2
+ //# sourceMappingURL=citations.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"citations.tools.js","names":[],"sources":["../../src/tools/citations.tools.ts"],"sourcesContent":["import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { OdpClient } from \"../clients/odp.client\"\nimport { config } from \"../lib/config\"\nimport { handleApiError } from \"../lib/errors\"\n\nconst CITATIONS_ANNOTATIONS = {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n} as const\n\nconst createClient = (): OdpClient => {\n return new OdpClient({\n apiKey:\n config.usptoApiKey ??\n (() => {\n throw new Error(\"USPTO_API_KEY is required\")\n })(),\n timeout: config.requestTimeout,\n })\n}\n\nexport const registerCitationsTools = (server: FastMCP): void => {\n server.addTool({\n name: \"citations-get-enriched\",\n description:\n \"Get enriched citation data for a patent, including forward and backward citations with metadata about cited/citing patents.\",\n parameters: z.object({\n patentNumber: z.string().describe(\"Patent number (e.g., US10123456 or 10123456)\"),\n }),\n annotations: CITATIONS_ANNOTATIONS,\n execute: async (args) => {\n try {\n const client = createClient()\n const result = await client.getEnrichedCitations(args.patentNumber)\n return JSON.stringify(result)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"citations-search\",\n description: \"Search patent citations across the USPTO database.\",\n parameters: z.object({\n query: z.string().describe(\"Search query for citations\"),\n limit: z.number().int().min(1).max(100).default(25).describe(\"Number of results to return (1-100)\"),\n }),\n annotations: CITATIONS_ANNOTATIONS,\n execute: async (args) => {\n try {\n const client = createClient()\n const result = await client.searchCitations(args.query, args.limit)\n return JSON.stringify(result)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"citations-get-metrics\",\n description:\n \"Get citation metrics for a patent including citation counts, citation velocity, and influence scores.\",\n parameters: z.object({\n patentNumber: z.string().describe(\"Patent number (e.g., US10123456 or 10123456)\"),\n }),\n annotations: CITATIONS_ANNOTATIONS,\n execute: async (args) => {\n try {\n const client = createClient()\n const result = await client.getCitationMetrics(args.patentNumber)\n return JSON.stringify(result)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"litigation-search\",\n description:\n \"Search patent litigation cases. Filter by plaintiff, defendant, patent number, court, and date range.\",\n parameters: z.object({\n query: z.string().optional().describe(\"Search query text\"),\n plaintiff: z.string().optional().describe(\"Plaintiff name filter\"),\n defendant: z.string().optional().describe(\"Defendant name filter\"),\n patent_number: z.string().optional().describe(\"Patent number filter\"),\n court: z.string().optional().describe(\"Court name filter\"),\n date_from: z.string().optional().describe(\"Start date filter (YYYY-MM-DD)\"),\n date_to: z.string().optional().describe(\"End date filter (YYYY-MM-DD)\"),\n limit: z.number().int().min(1).max(100).default(25).describe(\"Number of results to return (1-100)\"),\n }),\n annotations: CITATIONS_ANNOTATIONS,\n execute: async (args) => {\n try {\n const client = createClient()\n const result = await client.searchLitigation({\n query: args.query,\n plaintiff: args.plaintiff,\n defendant: args.defendant,\n patent_number: args.patent_number,\n court: args.court,\n date_from: args.date_from,\n date_to: args.date_to,\n limit: args.limit,\n })\n return JSON.stringify(result)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"litigation-get-case\",\n description: \"Get detailed information about a specific patent litigation case.\",\n parameters: z.object({\n caseId: z.string().describe(\"Litigation case identifier\"),\n }),\n annotations: CITATIONS_ANNOTATIONS,\n execute: async (args) => {\n try {\n const client = createClient()\n const result = await client.getLitigationCase(args.caseId)\n return JSON.stringify(result)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"litigation-get-patent\",\n description: \"Get all litigation cases involving a specific patent.\",\n parameters: z.object({\n patentNumber: z.string().describe(\"Patent number (e.g., US10123456 or 10123456)\"),\n }),\n annotations: CITATIONS_ANNOTATIONS,\n execute: async (args) => {\n try {\n const client = createClient()\n const result = await client.getLitigationByPatent(args.patentNumber)\n return JSON.stringify(result)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n}\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { FastMCP } from "fastmcp";
2
+
3
+ //#region src/tools/epo.tools.d.ts
4
+ declare const registerEpoTools: (server: FastMCP) => void;
5
+ //#endregion
6
+ export { registerEpoTools };
7
+ //# sourceMappingURL=epo.tools.d.ts.map
@@ -0,0 +1,18 @@
1
+ import{handleApiError as e}from"../lib/errors.js";import{epoFamilyLookup as t,epoGetAbstract as n,epoGetBiblio as r,epoGetClaims as i,epoGetDescription as a,epoLegalStatus as o,epoNumberConvert as s,epoSearchPatents as c}from"../clients/epo-ops.client.js";import{z as l}from"zod";const u=l.enum([`docdb`,`epodoc`,`original`]).default(`docdb`).describe(`Patent number format: docdb (CC.NNNNNNN.K), epodoc (CCNNNNNNN), or original`),d={readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},f=f=>{f.addTool({name:`epo-search-patents`,description:`Search European Patent Office via CQL query syntax.
2
+
3
+ CQL fields: ti (title), ab (abstract), ta (title+abstract), pa (applicant), in (inventor),
4
+ pn (publication number), cpc (CPC code), pd (publication date).
5
+ Operators: AND, OR, NOT. Truncation: * (multi-char), ? (single-char).
6
+ Max 10 query terms, max 2000 results.
7
+
8
+ Examples:
9
+ ti="antibody drug conjugate"
10
+ pa="Northwestern University" AND cpc=C07D487/04
11
+ ta=metarrestin AND pd>=20200101`,parameters:l.object({query:l.string().describe(`CQL query string`),range:l.string().optional().describe(`Result range, e.g. "1-25" (max 100 per request)`)}),annotations:d,execute:async t=>{try{let e=await c(t.query,t.range);return JSON.stringify(e,null,2)}catch(t){return e(t)}}}),f.addTool({name:`epo-get-biblio`,description:`Get bibliographic data for a patent from EPO OPS. Returns title, applicants, inventors, classification, priority claims, and publication details.`,parameters:l.object({number:l.string().describe(`Patent number (e.g., EP1000000, US7650331B1, WO2020123456)`),format:u}),annotations:d,execute:async t=>{try{let e=await r(t.number,t.format);return JSON.stringify(e,null,2)}catch(t){return e(t)}}}),f.addTool({name:`epo-get-abstract`,description:`Get the abstract text of a patent from EPO OPS.`,parameters:l.object({number:l.string().describe(`Patent number`),format:u}),annotations:d,execute:async t=>{try{let e=await n(t.number,t.format);return JSON.stringify(e,null,2)}catch(t){return e(t)}}}),f.addTool({name:`epo-get-claims`,description:`Get the full claims text of a patent from EPO OPS. Use this for reading claim language when PPUBS is unavailable.`,parameters:l.object({number:l.string().describe(`Patent number`),format:u}),annotations:d,execute:async t=>{try{let e=await i(t.number,t.format);return JSON.stringify(e,null,2)}catch(t){return e(t)}}}),f.addTool({name:`epo-get-description`,description:`Get the full patent description/specification text from EPO OPS. Use this for reading the detailed disclosure.`,parameters:l.object({number:l.string().describe(`Patent number`),format:u}),annotations:d,execute:async t=>{try{let e=await a(t.number,t.format);return JSON.stringify(e,null,2)}catch(t){return e(t)}}}),f.addTool({name:`epo-family-lookup`,description:`Look up INPADOC patent family members for a given patent. Returns all global family members
12
+ showing every jurisdiction where the invention has patent protection.
13
+
14
+ This is the highest-value EPO tool for FTO work — maps all family members across jurisdictions.
15
+ Critical for licensing, acquisition due diligence, and understanding worldwide patent coverage.`,parameters:l.object({number:l.string().describe(`Patent number to look up family for`),format:u}),annotations:d,execute:async n=>{try{let e=await t(n.number,n.format);return JSON.stringify(e,null,2)}catch(t){return e(t)}}}),f.addTool({name:`epo-legal-status`,description:`Get worldwide legal status events for a patent from EPO OPS.
16
+ Shows legal status across ~44 patent offices: granted, lapsed, opposed, withdrawn, etc.
17
+ Critical for determining if a patent is still in force in specific jurisdictions.`,parameters:l.object({number:l.string().describe(`Patent number`),format:u}),annotations:d,execute:async t=>{try{let e=await o(t.number,t.format);return JSON.stringify(e,null,2)}catch(t){return e(t)}}}),f.addTool({name:`epo-number-convert`,description:`Convert a patent number between formats: docdb (CC.NNNNNNN.K), epodoc (CCNNNNNNN), and original filing format.`,parameters:l.object({number:l.string().describe(`Patent number to convert`),input_format:l.enum([`docdb`,`epodoc`,`original`]).describe(`Input number format`),output_format:l.enum([`docdb`,`epodoc`,`original`]).describe(`Desired output format`)}),annotations:d,execute:async t=>{try{let e=await s(t.number,t.input_format,t.output_format);return JSON.stringify(e,null,2)}catch(t){return e(t)}}})};export{f as registerEpoTools};
18
+ //# sourceMappingURL=epo.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epo.tools.js","names":[],"sources":["../../src/tools/epo.tools.ts"],"sourcesContent":["import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport {\n epoFamilyLookup,\n epoGetAbstract,\n epoGetBiblio,\n epoGetClaims,\n epoGetDescription,\n epoLegalStatus,\n epoNumberConvert,\n epoSearchPatents,\n} from \"../clients/epo-ops.client\"\nimport { handleApiError } from \"../lib/errors\"\n\nconst numberFormatSchema = z\n .enum([\"docdb\", \"epodoc\", \"original\"])\n .default(\"docdb\")\n .describe(\"Patent number format: docdb (CC.NNNNNNN.K), epodoc (CCNNNNNNN), or original\")\n\nconst readOnlyAnnotations = {\n readOnlyHint: true as const,\n destructiveHint: false as const,\n idempotentHint: true as const,\n openWorldHint: true as const,\n}\n\nexport const registerEpoTools = (server: FastMCP): void => {\n server.addTool({\n name: \"epo-search-patents\",\n description: `Search European Patent Office via CQL query syntax.\n\nCQL fields: ti (title), ab (abstract), ta (title+abstract), pa (applicant), in (inventor),\npn (publication number), cpc (CPC code), pd (publication date).\nOperators: AND, OR, NOT. Truncation: * (multi-char), ? (single-char).\nMax 10 query terms, max 2000 results.\n\nExamples:\n ti=\"antibody drug conjugate\"\n pa=\"Northwestern University\" AND cpc=C07D487/04\n ta=metarrestin AND pd>=20200101`,\n parameters: z.object({\n query: z.string().describe(\"CQL query string\"),\n range: z.string().optional().describe('Result range, e.g. \"1-25\" (max 100 per request)'),\n }),\n annotations: readOnlyAnnotations,\n execute: async (args) => {\n try {\n const result = await epoSearchPatents(args.query, args.range)\n return JSON.stringify(result, null, 2)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"epo-get-biblio\",\n description:\n \"Get bibliographic data for a patent from EPO OPS. Returns title, applicants, inventors, classification, priority claims, and publication details.\",\n parameters: z.object({\n number: z.string().describe(\"Patent number (e.g., EP1000000, US7650331B1, WO2020123456)\"),\n format: numberFormatSchema,\n }),\n annotations: readOnlyAnnotations,\n execute: async (args) => {\n try {\n const result = await epoGetBiblio(args.number, args.format)\n return JSON.stringify(result, null, 2)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"epo-get-abstract\",\n description: \"Get the abstract text of a patent from EPO OPS.\",\n parameters: z.object({\n number: z.string().describe(\"Patent number\"),\n format: numberFormatSchema,\n }),\n annotations: readOnlyAnnotations,\n execute: async (args) => {\n try {\n const result = await epoGetAbstract(args.number, args.format)\n return JSON.stringify(result, null, 2)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"epo-get-claims\",\n description:\n \"Get the full claims text of a patent from EPO OPS. Use this for reading claim language when PPUBS is unavailable.\",\n parameters: z.object({\n number: z.string().describe(\"Patent number\"),\n format: numberFormatSchema,\n }),\n annotations: readOnlyAnnotations,\n execute: async (args) => {\n try {\n const result = await epoGetClaims(args.number, args.format)\n return JSON.stringify(result, null, 2)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"epo-get-description\",\n description:\n \"Get the full patent description/specification text from EPO OPS. Use this for reading the detailed disclosure.\",\n parameters: z.object({\n number: z.string().describe(\"Patent number\"),\n format: numberFormatSchema,\n }),\n annotations: readOnlyAnnotations,\n execute: async (args) => {\n try {\n const result = await epoGetDescription(args.number, args.format)\n return JSON.stringify(result, null, 2)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"epo-family-lookup\",\n description: `Look up INPADOC patent family members for a given patent. Returns all global family members\nshowing every jurisdiction where the invention has patent protection.\n\nThis is the highest-value EPO tool for FTO work — maps all family members across jurisdictions.\nCritical for licensing, acquisition due diligence, and understanding worldwide patent coverage.`,\n parameters: z.object({\n number: z.string().describe(\"Patent number to look up family for\"),\n format: numberFormatSchema,\n }),\n annotations: readOnlyAnnotations,\n execute: async (args) => {\n try {\n const result = await epoFamilyLookup(args.number, args.format)\n return JSON.stringify(result, null, 2)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"epo-legal-status\",\n description: `Get worldwide legal status events for a patent from EPO OPS.\nShows legal status across ~44 patent offices: granted, lapsed, opposed, withdrawn, etc.\nCritical for determining if a patent is still in force in specific jurisdictions.`,\n parameters: z.object({\n number: z.string().describe(\"Patent number\"),\n format: numberFormatSchema,\n }),\n annotations: readOnlyAnnotations,\n execute: async (args) => {\n try {\n const result = await epoLegalStatus(args.number, args.format)\n return JSON.stringify(result, null, 2)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"epo-number-convert\",\n description:\n \"Convert a patent number between formats: docdb (CC.NNNNNNN.K), epodoc (CCNNNNNNN), and original filing format.\",\n parameters: z.object({\n number: z.string().describe(\"Patent number to convert\"),\n input_format: z.enum([\"docdb\", \"epodoc\", \"original\"]).describe(\"Input number format\"),\n output_format: z.enum([\"docdb\", \"epodoc\", \"original\"]).describe(\"Desired output format\"),\n }),\n annotations: readOnlyAnnotations,\n execute: async (args) => {\n try {\n const result = await epoNumberConvert(args.number, args.input_format, args.output_format)\n return JSON.stringify(result, null, 2)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n}\n"],"mappings":"wRAeA,MAAM,EAAqB,EACxB,KAAK,CAAC,QAAS,SAAU,WAAW,CAAC,CACrC,QAAQ,QAAQ,CAChB,SAAS,8EAA8E,CAEpF,EAAsB,CAC1B,aAAc,GACd,gBAAiB,GACjB,eAAgB,GAChB,cAAe,GAChB,CAEY,EAAoB,GAA0B,CACzD,EAAO,QAAQ,CACb,KAAM,qBACN,YAAa;;;;;;;;;;mCAWb,WAAY,EAAE,OAAO,CACnB,MAAO,EAAE,QAAQ,CAAC,SAAS,mBAAmB,CAC9C,MAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,kDAAkD,CACzF,CAAC,CACF,YAAa,EACb,QAAS,KAAO,IAAS,CACvB,GAAI,CACF,IAAM,EAAS,MAAM,EAAiB,EAAK,MAAO,EAAK,MAAM,CAC7D,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,OAC/B,EAAO,CACd,OAAO,EAAe,EAAM,GAGjC,CAAC,CAEF,EAAO,QAAQ,CACb,KAAM,iBACN,YACE,oJACF,WAAY,EAAE,OAAO,CACnB,OAAQ,EAAE,QAAQ,CAAC,SAAS,6DAA6D,CACzF,OAAQ,EACT,CAAC,CACF,YAAa,EACb,QAAS,KAAO,IAAS,CACvB,GAAI,CACF,IAAM,EAAS,MAAM,EAAa,EAAK,OAAQ,EAAK,OAAO,CAC3D,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,OAC/B,EAAO,CACd,OAAO,EAAe,EAAM,GAGjC,CAAC,CAEF,EAAO,QAAQ,CACb,KAAM,mBACN,YAAa,kDACb,WAAY,EAAE,OAAO,CACnB,OAAQ,EAAE,QAAQ,CAAC,SAAS,gBAAgB,CAC5C,OAAQ,EACT,CAAC,CACF,YAAa,EACb,QAAS,KAAO,IAAS,CACvB,GAAI,CACF,IAAM,EAAS,MAAM,EAAe,EAAK,OAAQ,EAAK,OAAO,CAC7D,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,OAC/B,EAAO,CACd,OAAO,EAAe,EAAM,GAGjC,CAAC,CAEF,EAAO,QAAQ,CACb,KAAM,iBACN,YACE,oHACF,WAAY,EAAE,OAAO,CACnB,OAAQ,EAAE,QAAQ,CAAC,SAAS,gBAAgB,CAC5C,OAAQ,EACT,CAAC,CACF,YAAa,EACb,QAAS,KAAO,IAAS,CACvB,GAAI,CACF,IAAM,EAAS,MAAM,EAAa,EAAK,OAAQ,EAAK,OAAO,CAC3D,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,OAC/B,EAAO,CACd,OAAO,EAAe,EAAM,GAGjC,CAAC,CAEF,EAAO,QAAQ,CACb,KAAM,sBACN,YACE,iHACF,WAAY,EAAE,OAAO,CACnB,OAAQ,EAAE,QAAQ,CAAC,SAAS,gBAAgB,CAC5C,OAAQ,EACT,CAAC,CACF,YAAa,EACb,QAAS,KAAO,IAAS,CACvB,GAAI,CACF,IAAM,EAAS,MAAM,EAAkB,EAAK,OAAQ,EAAK,OAAO,CAChE,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,OAC/B,EAAO,CACd,OAAO,EAAe,EAAM,GAGjC,CAAC,CAEF,EAAO,QAAQ,CACb,KAAM,oBACN,YAAa;;;;iGAKb,WAAY,EAAE,OAAO,CACnB,OAAQ,EAAE,QAAQ,CAAC,SAAS,sCAAsC,CAClE,OAAQ,EACT,CAAC,CACF,YAAa,EACb,QAAS,KAAO,IAAS,CACvB,GAAI,CACF,IAAM,EAAS,MAAM,EAAgB,EAAK,OAAQ,EAAK,OAAO,CAC9D,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,OAC/B,EAAO,CACd,OAAO,EAAe,EAAM,GAGjC,CAAC,CAEF,EAAO,QAAQ,CACb,KAAM,mBACN,YAAa;;mFAGb,WAAY,EAAE,OAAO,CACnB,OAAQ,EAAE,QAAQ,CAAC,SAAS,gBAAgB,CAC5C,OAAQ,EACT,CAAC,CACF,YAAa,EACb,QAAS,KAAO,IAAS,CACvB,GAAI,CACF,IAAM,EAAS,MAAM,EAAe,EAAK,OAAQ,EAAK,OAAO,CAC7D,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,OAC/B,EAAO,CACd,OAAO,EAAe,EAAM,GAGjC,CAAC,CAEF,EAAO,QAAQ,CACb,KAAM,qBACN,YACE,iHACF,WAAY,EAAE,OAAO,CACnB,OAAQ,EAAE,QAAQ,CAAC,SAAS,2BAA2B,CACvD,aAAc,EAAE,KAAK,CAAC,QAAS,SAAU,WAAW,CAAC,CAAC,SAAS,sBAAsB,CACrF,cAAe,EAAE,KAAK,CAAC,QAAS,SAAU,WAAW,CAAC,CAAC,SAAS,wBAAwB,CACzF,CAAC,CACF,YAAa,EACb,QAAS,KAAO,IAAS,CACvB,GAAI,CACF,IAAM,EAAS,MAAM,EAAiB,EAAK,OAAQ,EAAK,aAAc,EAAK,cAAc,CACzF,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,OAC/B,EAAO,CACd,OAAO,EAAe,EAAM,GAGjC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { FastMCP } from "fastmcp";
2
+
3
+ //#region src/tools/index.d.ts
4
+ declare const registerAllTools: (server: FastMCP) => void;
5
+ //#endregion
6
+ export { registerAllTools };
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,2 @@
1
+ import{config as e}from"../lib/config.js";import{registerBigQueryTools as t}from"./bigquery.tools.js";import"../base.client-zZnUjoIb.js";import{registerCitationsTools as n}from"./citations.tools.js";import{registerEpoTools as r}from"./epo.tools.js";import{registerOdpTools as i}from"./odp.tools.js";import{registerOfficeActionsTools as a}from"./office-actions.tools.js";import{registerPatentsViewTools as o}from"./patentsview.tools.js";import{registerPtabTools as s}from"./ptab.tools.js";import{registerUtilityTools as c}from"./utility.tools.js";const l=l=>{e.patentsViewApiKey&&o(l),e.usptoApiKey&&(i(l),s(l),n(l),a(l)),e.epoConsumerKey&&e.epoConsumerSecret&&r(l),e.googleApplicationCredentials&&e.googleCloudProject&&t(l),c(l)};export{l as registerAllTools};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/tools/index.ts"],"sourcesContent":["import type { FastMCP } from \"fastmcp\"\n\nimport { config } from \"../lib/config\"\nimport { registerBigQueryTools } from \"./bigquery.tools\"\nimport { registerCitationsTools } from \"./citations.tools\"\nimport { registerEpoTools } from \"./epo.tools\"\nimport { registerOdpTools } from \"./odp.tools\"\nimport { registerOfficeActionsTools } from \"./office-actions.tools\"\nimport { registerPatentsViewTools } from \"./patentsview.tools\"\nimport { registerPtabTools } from \"./ptab.tools\"\nimport { registerUtilityTools } from \"./utility.tools\"\n\nexport const registerAllTools = (server: FastMCP): void => {\n if (config.patentsViewApiKey) {\n registerPatentsViewTools(server)\n }\n if (config.usptoApiKey) {\n registerOdpTools(server)\n registerPtabTools(server)\n registerCitationsTools(server)\n registerOfficeActionsTools(server)\n }\n if (config.epoConsumerKey && config.epoConsumerSecret) {\n registerEpoTools(server)\n }\n if (config.googleApplicationCredentials && config.googleCloudProject) {\n registerBigQueryTools(server)\n }\n registerUtilityTools(server)\n}\n"],"mappings":"kiBAYA,MAAa,EAAoB,GAA0B,CACrD,EAAO,mBACT,EAAyB,EAAO,CAE9B,EAAO,cACT,EAAiB,EAAO,CACxB,EAAkB,EAAO,CACzB,EAAuB,EAAO,CAC9B,EAA2B,EAAO,EAEhC,EAAO,gBAAkB,EAAO,mBAClC,EAAiB,EAAO,CAEtB,EAAO,8BAAgC,EAAO,oBAChD,EAAsB,EAAO,CAE/B,EAAqB,EAAO"}
@@ -0,0 +1,7 @@
1
+ import { FastMCP } from "fastmcp";
2
+
3
+ //#region src/tools/odp.tools.d.ts
4
+ declare const registerOdpTools: (server: FastMCP) => void;
5
+ //#endregion
6
+ export { registerOdpTools };
7
+ //# sourceMappingURL=odp.tools.d.ts.map
@@ -0,0 +1,2 @@
1
+ import{config as e}from"../lib/config.js";import{handleApiError as t}from"../lib/errors.js";import"../base.client-zZnUjoIb.js";import{OdpClient as n}from"../clients/odp.client.js";import{z as r}from"zod";const i={readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!0},a=()=>{if(!e.usptoApiKey)throw Error(`USPTO_API_KEY is required for ODP tools`);return new n({apiKey:e.usptoApiKey,timeout:e.requestTimeout})},o=e=>{e.addTool({name:`odp-search-applications`,description:`Search USPTO patent applications via the Open Data Portal. Coverage: applications filed January 1, 2001 and later. Supports full-text search across application data.`,parameters:r.object({query:r.string().describe(`Search query text`),limit:r.number().int().min(1).max(100).default(25).describe(`Number of results to return (1-100)`),offset:r.number().int().min(0).default(0).describe(`Result offset for pagination`),sort:r.string().optional().describe(`Sort field and direction`)}),annotations:i,execute:async e=>{try{let t=await a().searchApplications(e.query,e.limit,e.offset,e.sort);return JSON.stringify(t)}catch(e){return t(e)}}}),e.addTool({name:`odp-get-application`,description:`Get detailed information about a specific USPTO patent application by application number. Returns filing data, status, claims, and other application details.`,parameters:r.object({applicationNumberText:r.string().describe(`Application number (e.g., 16/123,456 or 16123456)`)}),annotations:i,execute:async e=>{try{let t=await a().getApplication(e.applicationNumberText);return JSON.stringify(t)}catch(e){return t(e)}}}),e.addTool({name:`odp-get-application-metadata`,description:`Get metadata for a USPTO patent application including application type, entity status, and dates.`,parameters:r.object({applicationNumberText:r.string().describe(`Application number (e.g., 16/123,456 or 16123456)`)}),annotations:i,execute:async e=>{try{let t=await a().getApplicationMetadata(e.applicationNumberText);return JSON.stringify(t)}catch(e){return t(e)}}}),e.addTool({name:`odp-get-continuity`,description:`Get continuity data (parent/child relationships) for a patent application. Shows continuation, divisional, and CIP relationships.`,parameters:r.object({applicationNumberText:r.string().describe(`Application number (e.g., 16/123,456 or 16123456)`)}),annotations:i,execute:async e=>{try{let t=await a().getContinuity(e.applicationNumberText);return JSON.stringify(t)}catch(e){return t(e)}}}),e.addTool({name:`odp-get-assignment`,description:`Get assignment/ownership records for a patent application. Shows current and historical assignees.`,parameters:r.object({applicationNumberText:r.string().describe(`Application number (e.g., 16/123,456 or 16123456)`)}),annotations:i,execute:async e=>{try{let t=await a().getAssignment(e.applicationNumberText);return JSON.stringify(t)}catch(e){return t(e)}}}),e.addTool({name:`odp-get-adjustment`,description:`Get patent term adjustment (PTA) data for an application. Shows delays attributable to the USPTO and applicant.`,parameters:r.object({applicationNumberText:r.string().describe(`Application number (e.g., 16/123,456 or 16123456)`)}),annotations:i,execute:async e=>{try{let t=await a().getAdjustment(e.applicationNumberText);return JSON.stringify(t)}catch(e){return t(e)}}}),e.addTool({name:`odp-get-attorney`,description:`Get attorney/agent information for a patent application.`,parameters:r.object({applicationNumberText:r.string().describe(`Application number (e.g., 16/123,456 or 16123456)`)}),annotations:i,execute:async e=>{try{let t=await a().getAttorney(e.applicationNumberText);return JSON.stringify(t)}catch(e){return t(e)}}}),e.addTool({name:`odp-get-foreign-priority`,description:`Get foreign priority claims for a patent application.`,parameters:r.object({applicationNumberText:r.string().describe(`Application number (e.g., 16/123,456 or 16123456)`)}),annotations:i,execute:async e=>{try{let t=await a().getForeignPriority(e.applicationNumberText);return JSON.stringify(t)}catch(e){return t(e)}}}),e.addTool({name:`odp-get-transactions`,description:`Get transaction history for a patent application. Shows all prosecution events in chronological order.`,parameters:r.object({applicationNumberText:r.string().describe(`Application number (e.g., 16/123,456 or 16123456)`)}),annotations:i,execute:async e=>{try{let t=await a().getTransactions(e.applicationNumberText);return JSON.stringify(t)}catch(e){return t(e)}}}),e.addTool({name:`odp-get-documents`,description:`Get document listing for a patent application. Returns metadata about filed and issued documents.`,parameters:r.object({applicationNumberText:r.string().describe(`Application number (e.g., 16/123,456 or 16123456)`)}),annotations:i,execute:async e=>{try{let t=await a().getDocuments(e.applicationNumberText);return JSON.stringify(t)}catch(e){return t(e)}}}),e.addTool({name:`odp-search-datasets`,description:`Search USPTO bulk data datasets available through the Open Data Portal.`,parameters:r.object({query:r.string().describe(`Search query for datasets`)}),annotations:i,execute:async e=>{try{let t=await a().searchDatasets(e.query);return JSON.stringify(t)}catch(e){return t(e)}}}),e.addTool({name:`odp-get-dataset`,description:`Get details about a specific USPTO bulk data dataset by product ID.`,parameters:r.object({productId:r.string().describe(`Dataset product identifier`)}),annotations:i,execute:async e=>{try{let t=await a().getDataset(e.productId);return JSON.stringify(t)}catch(e){return t(e)}}})};export{o as registerOdpTools};
2
+ //# sourceMappingURL=odp.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"odp.tools.js","names":[],"sources":["../../src/tools/odp.tools.ts"],"sourcesContent":["import type { FastMCP } from \"fastmcp\"\nimport { z } from \"zod\"\n\nimport { OdpClient } from \"../clients/odp.client\"\nimport { config } from \"../lib/config\"\nimport { handleApiError } from \"../lib/errors\"\n\nconst ODP_ANNOTATIONS = {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n} as const\n\nconst createClient = (): OdpClient => {\n if (!config.usptoApiKey) {\n throw new Error(\"USPTO_API_KEY is required for ODP tools\")\n }\n return new OdpClient({\n apiKey: config.usptoApiKey,\n timeout: config.requestTimeout,\n })\n}\n\nexport const registerOdpTools = (server: FastMCP): void => {\n server.addTool({\n name: \"odp-search-applications\",\n description:\n \"Search USPTO patent applications via the Open Data Portal. Coverage: applications filed January 1, 2001 and later. Supports full-text search across application data.\",\n parameters: z.object({\n query: z.string().describe(\"Search query text\"),\n limit: z.number().int().min(1).max(100).default(25).describe(\"Number of results to return (1-100)\"),\n offset: z.number().int().min(0).default(0).describe(\"Result offset for pagination\"),\n sort: z.string().optional().describe(\"Sort field and direction\"),\n }),\n annotations: ODP_ANNOTATIONS,\n execute: async (args) => {\n try {\n const client = createClient()\n const result = await client.searchApplications(args.query, args.limit, args.offset, args.sort)\n return JSON.stringify(result)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"odp-get-application\",\n description:\n \"Get detailed information about a specific USPTO patent application by application number. Returns filing data, status, claims, and other application details.\",\n parameters: z.object({\n applicationNumberText: z.string().describe(\"Application number (e.g., 16/123,456 or 16123456)\"),\n }),\n annotations: ODP_ANNOTATIONS,\n execute: async (args) => {\n try {\n const client = createClient()\n const result = await client.getApplication(args.applicationNumberText)\n return JSON.stringify(result)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"odp-get-application-metadata\",\n description: \"Get metadata for a USPTO patent application including application type, entity status, and dates.\",\n parameters: z.object({\n applicationNumberText: z.string().describe(\"Application number (e.g., 16/123,456 or 16123456)\"),\n }),\n annotations: ODP_ANNOTATIONS,\n execute: async (args) => {\n try {\n const client = createClient()\n const result = await client.getApplicationMetadata(args.applicationNumberText)\n return JSON.stringify(result)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"odp-get-continuity\",\n description:\n \"Get continuity data (parent/child relationships) for a patent application. Shows continuation, divisional, and CIP relationships.\",\n parameters: z.object({\n applicationNumberText: z.string().describe(\"Application number (e.g., 16/123,456 or 16123456)\"),\n }),\n annotations: ODP_ANNOTATIONS,\n execute: async (args) => {\n try {\n const client = createClient()\n const result = await client.getContinuity(args.applicationNumberText)\n return JSON.stringify(result)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"odp-get-assignment\",\n description: \"Get assignment/ownership records for a patent application. Shows current and historical assignees.\",\n parameters: z.object({\n applicationNumberText: z.string().describe(\"Application number (e.g., 16/123,456 or 16123456)\"),\n }),\n annotations: ODP_ANNOTATIONS,\n execute: async (args) => {\n try {\n const client = createClient()\n const result = await client.getAssignment(args.applicationNumberText)\n return JSON.stringify(result)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"odp-get-adjustment\",\n description:\n \"Get patent term adjustment (PTA) data for an application. Shows delays attributable to the USPTO and applicant.\",\n parameters: z.object({\n applicationNumberText: z.string().describe(\"Application number (e.g., 16/123,456 or 16123456)\"),\n }),\n annotations: ODP_ANNOTATIONS,\n execute: async (args) => {\n try {\n const client = createClient()\n const result = await client.getAdjustment(args.applicationNumberText)\n return JSON.stringify(result)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"odp-get-attorney\",\n description: \"Get attorney/agent information for a patent application.\",\n parameters: z.object({\n applicationNumberText: z.string().describe(\"Application number (e.g., 16/123,456 or 16123456)\"),\n }),\n annotations: ODP_ANNOTATIONS,\n execute: async (args) => {\n try {\n const client = createClient()\n const result = await client.getAttorney(args.applicationNumberText)\n return JSON.stringify(result)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"odp-get-foreign-priority\",\n description: \"Get foreign priority claims for a patent application.\",\n parameters: z.object({\n applicationNumberText: z.string().describe(\"Application number (e.g., 16/123,456 or 16123456)\"),\n }),\n annotations: ODP_ANNOTATIONS,\n execute: async (args) => {\n try {\n const client = createClient()\n const result = await client.getForeignPriority(args.applicationNumberText)\n return JSON.stringify(result)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"odp-get-transactions\",\n description:\n \"Get transaction history for a patent application. Shows all prosecution events in chronological order.\",\n parameters: z.object({\n applicationNumberText: z.string().describe(\"Application number (e.g., 16/123,456 or 16123456)\"),\n }),\n annotations: ODP_ANNOTATIONS,\n execute: async (args) => {\n try {\n const client = createClient()\n const result = await client.getTransactions(args.applicationNumberText)\n return JSON.stringify(result)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"odp-get-documents\",\n description: \"Get document listing for a patent application. Returns metadata about filed and issued documents.\",\n parameters: z.object({\n applicationNumberText: z.string().describe(\"Application number (e.g., 16/123,456 or 16123456)\"),\n }),\n annotations: ODP_ANNOTATIONS,\n execute: async (args) => {\n try {\n const client = createClient()\n const result = await client.getDocuments(args.applicationNumberText)\n return JSON.stringify(result)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"odp-search-datasets\",\n description: \"Search USPTO bulk data datasets available through the Open Data Portal.\",\n parameters: z.object({\n query: z.string().describe(\"Search query for datasets\"),\n }),\n annotations: ODP_ANNOTATIONS,\n execute: async (args) => {\n try {\n const client = createClient()\n const result = await client.searchDatasets(args.query)\n return JSON.stringify(result)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n\n server.addTool({\n name: \"odp-get-dataset\",\n description: \"Get details about a specific USPTO bulk data dataset by product ID.\",\n parameters: z.object({\n productId: z.string().describe(\"Dataset product identifier\"),\n }),\n annotations: ODP_ANNOTATIONS,\n execute: async (args) => {\n try {\n const client = createClient()\n const result = await client.getDataset(args.productId)\n return JSON.stringify(result)\n } catch (error) {\n return handleApiError(error)\n }\n },\n })\n}\n"],"mappings":"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"}