@pipeworx/uspto-office-actions
Connect: https://pipeworx.io/mcp — every tool in the catalog, including @pipeworx/uspto-office-actions’s. Install: one-click buttons
Connect to just the @pipeworx/uspto-office-actions pack
https://gateway.pipeworx.io/uspto-office-actions/mcp — only @pipeworx/uspto-office-actions’s own tools, nothing else in the catalog.
No MCP client? Skip the connection: POST https://gateway.pipeworx.io/v1/tools/search_packs {"query":"..."} to find a tool below, GET /v1/tools/<name> for its schema, POST the same URL with arguments for the data — see For AI agents.
Tools: 5
USPTO patent prosecution history — office action full text, examiner/applicant citations (plus AI/ML-extracted “enriched citation” metadata), claim-level rejection data (35 U.S.C. 101/102/103/112), and Commissioner final decisions on patent application petitions.
Tools
search_office_actions(application_number | patent_number, limit)— office actions on an application: action type, mail date, examiner employee number, art unit, newest first.get_office_action_text(document_id | (application_number + mail_date))— one office action’s full text, its length, and a truncation flag.get_office_action_rejections(application_number, limit)— claim-level rejection data: AGGREGATE counts of 101/102/103/112/double-patenting rejection records first, per-record detail last.get_office_action_citations(application_number, limit)— references cited in office actions, who cited them (examiner vs applicant), plus the AI/ML-extracted enriched-citation fields (category code, claim/paragraph passage mapping) when USPTO has them for that citation.search_petition_decisions(query | application_number, decided_after, decided_before, limit, offset)— Commissioner / Office of Petitions final decisions: decision type, decision date, petition type, deciding office.
Auth
Platform key (PLATFORM_USPTO_KEY) with BYO override via _apiKey. Get a free
key at https://data.uspto.gov/myodp. As of 2026-10, USPTO requires ID.me
identity verification plus four profile fields on new/renewed ODP accounts —
a BYO key from an account that has not completed that will read as rejected
even though it is correctly formatted.
Data sources
- USPTO, Open Data Portal — Office Action Text Retrieval dataset (public domain, CC0 mark). Covers published office actions starting with the 12-million application series.
- USPTO, Open Data Portal — Office Action Citations dataset.
- USPTO, Open Data Portal — Office Action Rejection dataset.
- USPTO, Open Data Portal — Enriched Citation (AI/ML-extracted) dataset.
- USPTO, Open Data Portal — Final Petition Decisions dataset.
Name the publisher and dataset only, never a route — the exact endpoints live
in src/index.ts.
Notes
- The legacy
developer.uspto.govOffice Action APIs are dead (blanket 301 todata.uspto.gov/home, confirmed 2026-10-18). This pack calls their live replacements onapi.uspto.gov. - The real request shape took FIVE rounds of live probing to find (fleet
#3305, 2026-10-18 — cluster-c’s own probe, then Antonio, then this pack’s
own follow-ups, then Antonio again). THREE shapes are disproven, not just
untried — do not re-try them: (1) a simple
GET /office-actionsresource exists (401 with no key, 403 “Forbidden” with a bad one) but rejects every query shape tried against it (q/sizealone, or hedged with legacycriteria/rows) with"missing path or query params"— its real contract is still unknown and this pack does NOT call it; (2)GET <route>/searchandGET <route>/<applicationNumber>are both disproven directly against the live upstream — both answer403 "Missing Authentication Token"on ANY key, the AWS routing-level “no such resource” signature; neither sub-path exists. (3) What this pack actually calls:POST /api/v1/patent/oa/<dataset>/<version>/records, form-encodedcriteria(Lucene)/start/rows— the ORIGINAL dataset routes from the open-sourcepatent-dev/uspto-odpGo client’s own checked-in OpenAPI specs, first misread as dead because a bogus-key probe against them returned the SAME STATUS CODE (403) as this pack’s own bogus-path control. The actual distinguishing signal on this subtree is the BODY:{"message":"Forbidden"}means “real route, bad key”;{"message":"Missing Authentication Token"}means “no such resource” — two different 403 bodies, previously conflated into one status code. A live keyless probe confirmed all four dataset/version pairs answer “Forbidden”. SeeOA_DATASETSinsrc/index.tsfor the exact dataset/version table and which swagger file backs each entry — enriched citations’ primary candidate uses the swagger file’s own dataset name (enriched_cited_reference_metadata, v3) rather than theoa_enriched_citationsv1/v2 guessed live, kept as a fallback. If this is STILL wrong, every tool acceptsinclude_raw: true, which skips normal parsing/error-handling and returns the bare upstream HTTP status + first 500 chars of body instead — a live probe can self-diagnose the next miss without a code change + redeploy cycle. - The response envelope is the classic Solr shape
(
{response:{numFound,docs:[...]}}, confirmed via real response examples from the open-sourcepatent-dev/uspto-odpGo client). An unrecognized shape throws loudly (upstream_parse: ...) with the raw body, rather than returning a quiet empty result. - Final Petition Decisions is fully confirmed, not inferred: both its
route (
/api/v1/petition/decisions/search, POST, JSON{q, pagination:{offset,limit}, filters:[{name,value}]}) and its response shape ({count, petitionDecisionDataBag:[...]}) match the same Go client’s checked-in real example responses, and the route itself was independently confirmed live (401 Unauthorized) by this pack’s own probe. - USPTO’s null-date sentinel is
"0001-01-01T00:00:00"— treated asnulleverywhere in this pack’s output (an ungranted application has nogrant_date, not a 1-AD one). obsoleteDocumentIdentifier(USPTO’s own, oddly-retained field name) is exposed to callers asdocument_id— it is the stable per-document key, not actually obsolete data.- No fleet-held credential was reachable from a local/dev run while building
this pack (the platform key lives only in the deployed gateway’s secret
store), so the pre-deploy smoke test below exercises real network calls to
api.uspto.govand confirms the request/response code runs cleanly, but could only observe the auth-rejection path, not a real payload. The first real verification is the live, authenticated post-deploy probe.
Tools
- search_office_actions — Search USPTO office actions (and related prosecution-history documents, e.g. petition decisions filed in the same document stream) for one patent application. Returns action type (non-final rejection,
- get_office_action_text — Fetch one USPTO office action’s full text. Pass document_id (from search_office_actions’ document_id field) for an exact match, or application_number + mail_date to look it up by application and date.
- get_office_action_rejections — Claim-level rejection data for every office action on one application. Returns AGGREGATE counts first (how many rejection records cite 35 U.S.C. 101/102/103/112, and double-patenting) and per-claim/pe
- get_office_action_citations — References cited in office actions for one application — who cited each one (examiner vs applicant), the legal basis (102/103 etc.) it was cited under, and the AI/ML-extracted “enriched citation” fiel
- search_petition_decisions — Search USPTO Commissioner / Office of Petitions final decisions. Pass application_number for one application’s petition history, or query for free-text search across decisions (petition issue text, in
Tools
get_office_action_citations— References cited in office actions for one application — who cited each one (examiner vs applicant), the legal basis (102/103 etc.) it was cited under, and the AI/ML-extracted enriched citation fieldsget_office_action_rejections— Claim-level rejection data for every office action on one application. Returns AGGREGATE counts first (how many rejection records cite 35 U.S.C. 101/102/103/112, and double-patenting) and per-claim/peget_office_action_text— Fetch one USPTO office action's full text. Pass document_id (from search_office_actions' document_id field) for an exact match, or application_number + mail_date to look it up by application and date.search_office_actions— Search USPTO office actions (and related prosecution-history documents, e.g. petition decisions filed in the same document stream) for one patent application. Returns action type (non-final rejection,search_petition_decisions— Search USPTO Commissioner / Office of Petitions final decisions. Pass application_number for one application's petition history, or query for free-text search across decisions (petition issue text, in