Recipe: Patent due diligence
The task
You have a company or a technology area and need a patent/trademark landscape — who’s filing, who owns the most relevant IP, and whether the company’s own trademark portfolio is what you’d expect — before you say anything about its IP position.
Tools used: the patents pack’s search + detail tools (namespaced patents_search_patents
on the gateway — see Step 1), get_patent, edgar_search_filings, search_trademarks.
Copy-paste prompt
Run patent due diligence on "<company or technology area>" with Pipeworx: search USPTO
patent applications, pull detail on the top few, cross-reference any public-company
assignee's SEC filings for IP-related risk disclosures, and check the company's own live
trademark portfolio (filtered to marks it actually owns, not just marks containing its
name). Flag anything that's a same-word match rather than the actual entity.
What a good answer looks like
patents_search_patents({ query: "CRISPR gene editing", limit: 5 })
returns (live call, 2026-08-06 — trimmed):
{
"query": "\"CRISPR\" AND \"gene\" AND \"editing\"",
"total": 217,
"returned": 5,
"note": "ODP returns at most 25 records per search regardless of `limit`; 217 applications match.",
"results": [
{
"patent_number": "18871042",
"title": "Novel CRISPR Gene Editing System",
"grant_date": null,
"filing_date": "2026-02-18",
"first_inventor": "Caixia Gao"
}
],
"patents": [
{
"application_number": "18871042",
"status": "Docketed New Case - Ready for Examination",
"first_applicant": "Beijing Qi Biotechnology Company Limited",
"applicants": ["Beijing Qi Biotechnology Company Limited", "Institute of Genetics and Developmental Biology, Chinese Academy of Sciences"],
"classification": "435/199"
}
]
}
A trustworthy answer has:
- a
totalcount against anoteexplaining the 25-record USPTO cap — 217 matches doesn’t mean you’re seeing 217 results; narrow withapplicant/filed_afterrather than raisinglimitpast 25. statuson every patent ("Docketed New Case - Ready for Examination","Application Undergoing Preexam Processing", etc.) — this is a pending-application system (USPTO’s Open Data Portal), not a granted-patent database. Most results here haven’t been examined yet.- for a company assignee, an
applicantsarray you can cross-reference against EDGAR — see Step 3 below.
The load-bearing trap: patent_number in the search results is the USPTO application
number, not a granted patent number. "18871042" is what get_patent and the
pipeworx://uspto/patent/{number} resource both expect. Feed either a granted-patent-style
number instead ("US10123456") and you get a clean, honest failure — not silent wrong data:
get_patent({ number: "US10123456" })
// → { found: false, application_number: "US10123456",
// hint: "No patent application found for that number. Confirm the format (digits only, e.g. \"16123456\")." }
That’s the good failure mode. The bad one is more subtle: get_patent does not return
claims text, citations, or family members — despite what a summary of “full patent detail”
might lead you to expect. A real call:
get_patent({ number: "18871042" })
// → { found: true, application_number: "18871042", title: "...", status: "...",
// inventors: [...], first_applicant: "...", applicants: [...],
// classification: "435/199", grant_event: {...} }
// — no `claims`, no `citations`, no `family_members` field exists in the response.
If you need assignment/conveyance history instead, get_patent_assignments({ application_number })
covers that (separately) — but it’s assignment records, not claims either, and its own
interpretation field says as much: “They do not establish current legal title, patent
validity or scope, … inspect the recorded document and obtain legal advice.”
Step-by-step tool calls
1. Patent search
patents_search_patents({ query: "CRISPR gene editing" })
// or: patents_search_patents({ query: "Tesla autonomous driving" })
// or narrow directly: patents_search_patents({ applicant: "APPLE INC.", query: "*" })
applicant needs the exact corporate suffix as filed — “Apple Inc.” returns hundreds,
“Apple” returns a warning field and zero rows. The tool description lists the common forms
(PBC / Inc. / LLC / Corporation / Co. / NV / AG / KK).
2. Drill into top applications
get_patent({ number: "18871042" }) // application_number from step 1's results, unmodified
Parallelize for several:
const top = await patents_search_patents({ query: "CRISPR gene editing" })
const detailed = await Promise.all(
top.results.slice(0, 5).map(p => get_patent({ number: p.patent_number }))
)
3. Map assignees to EDGAR
Group results by first_applicant — or the full applicants array, since some filings list
multiple assignees. For any that are public companies:
edgar_search_filings({ query: "Vertex CRISPR" })
live-verified this surfaces both VERTEX PHARMACEUTICALS INC / MA and CRISPR Therapeutics AG
filings (10-K, 10-Q, 8-K, S-1/A) with accession numbers — look for IP disclosures in the
most recent 10-K’s Item 1A risk factors.
4. Trademarks for product/brand names — filter to the actual owner
search_trademarks({ query: "Tesla", live_only: true, limit: 5 })
Without an owner filter, this is a wordmark search across the entire US register, not a
company’s trademark portfolio. Live example — the top 5 live “Tesla” marks are:
TESLA TERAFAB — Tesla, Inc. (Texas)
TESLA VODA — Gordana Brankovič, INDIVIDUAL (Serbia) ← unrelated
TESLA — Terence Emery Ducre, INDIVIDUAL (USA) ← unrelated
TESLA BASECHARGER — Tesla, Inc. (Texas)
TESLA COFFEE — Tesla Coffee LLC / Tesla License Company ← unrelated
Two of the top five are individuals or unrelated LLCs who happened to register a mark
containing the word “Tesla” — nothing to do with Tesla, Inc. A summary built from these
results without checking owner would misattribute someone else’s beverage or coffee mark
to the car company. Filter it out:
search_trademarks({ query: "Tesla", owner: "Tesla, Inc.", live_only: true, limit: 5 })
// → 41 live matches, all owner: "Tesla, Inc. (CORPORATION; Texas, USA)"
total_matches alone (120 → 41 after the owner filter) is itself a useful signal for how
much of a raw wordmark search is noise.
Citation pattern
CRISPR gene editing: 217 pending/recent USPTO applications match (per
patents_search_patents); top applicants include Beijing Qi Biotechnology and Arbor Biotechnologies. Vertex Pharmaceuticals’ CRISPR-related disclosures appear in its 10-K filings. Tesla, Inc. holds 41 live US trademarks as of this writing (search filtered toowner: "Tesla, Inc.").
pipeworx://uspto/patent/{number} expects the ODP application number (e.g. 18871042),
not a granted-patent-format number — the same trap as get_patent above.
Caveats
- This is an applications database, not a granted-patent registry. USPTO’s Open Data
Portal indexes the application lifecycle — most results are pending or recently docketed,
not issued patents.
statustells you where each one is; don’t assume “found a patent” means “found an issued right.” patent_numberin search results is the application number, reused consistently acrossget_patent,get_patent_assignments, and thepipeworx://uspto/patent/{number}resource — but not the format most people mean by “patent number” (US##,###,### granted-patent style). Confirm you’re using the right ID space before citing one.get_patenthas no claims, citations, or family-member data. For prosecution-adjacent detail,get_patent_assignmentscovers recorded conveyances only — not claims scope, validity, or a complete chain of title (its own response says so).search_trademarkswithoutowneris a keyword search of the whole US register. Anyone can register a wordmark containing your target’s name; filter byownerbefore treating a hit as part of the company’s portfolio.- Known issue, filed 2026-08-06: the server-side
patent_due_diligenceprompt template (prompts/get) currently calls a tool namedtrademark_search, which does not exist on the gateway — the real tool issearch_trademarks. Call it directly per Step 4 above rather than relying on the prompt for that step until the fix lands. - Assignee normalization. “Vertex Pharmaceuticals Inc.”, “Vertex Pharmaceuticals”, and “VERTEX PHARMACEUTICALS, INC.” are the same company. Group case-insensitive after stripping legal suffixes before ranking assignees.
- Foreign filings not covered. USPTO only. EPO, JPO, CNIPA need separate sources —
epo_ops_search_patentscovers the EPO side if you need it. - Trademark vs. patent. Different protections, different timelines. A strong trademark portfolio doesn’t imply patent strength, and vice versa.
Use the prompt
prompts/get({
name: "patent_due_diligence",
arguments: { subject: "CRISPR gene editing" }
})
Returns a substituted prompt orchestrating steps 1–3 above. See the known-issue caveat for step 4 (trademarks).