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 total count against a note explaining the 25-record USPTO cap — 217 matches doesn’t mean you’re seeing 217 results; narrow with applicant/filed_after rather than raising limit past 25.
  • status on 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 applicants array 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

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 to owner: "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. status tells you where each one is; don’t assume “found a patent” means “found an issued right.”
  • patent_number in search results is the application number, reused consistently across get_patent, get_patent_assignments, and the pipeworx://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_patent has no claims, citations, or family-member data. For prosecution-adjacent detail, get_patent_assignments covers recorded conveyances only — not claims scope, validity, or a complete chain of title (its own response says so).
  • search_trademarks without owner is a keyword search of the whole US register. Anyone can register a wordmark containing your target’s name; filter by owner before treating a hit as part of the company’s portfolio.
  • Known issue, filed 2026-08-06: the server-side patent_due_diligence prompt template (prompts/get) currently calls a tool named trademark_search, which does not exist on the gateway — the real tool is search_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_patents covers 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).

Last reviewed August 6, 2026