Skip to main content
Glama
john-walkoe

USPTO Patent Citation MCP Server

by john-walkoe

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
FASTMCP_HOSTNoHTTP bind address0.0.0.0
FASTMCP_PORTNoHTTP port when using HTTP transport8000
USPTO_API_KEYYesYour USPTO API key (required, free from USPTO Open Data Portal)
CORS_EXTRA_ORIGINNoAdditional CORS origin for reverse proxy deployments
FASTMCP_TRANSPORTNoTransport mode: 'stdio' for Claude Desktop, 'http' for HTTP transportstdio
INTERNAL_AUTH_SECRETNoShared secret for endpoint authentication (x-api-key header). Opt-in: if unset, all requests pass through.
MCP_APP_EXTRA_DOMAINSNoComma-separated additional domains for MCP Apps Content-Security-Policy

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
logging
{}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
Citations_get_available_fieldsA

Get all searchable fields from USPTO Enriched Citation API. Fields, available fields, columns, schema, what can I query, field names, query syntax for the enriched citations lane.

Use for: Field discovery, query syntax validation, understanding data structure. Returns: Complete field list with descriptions and types.

For field selection strategies and Solr/Lucene syntax examples, use Citations_get_guidance(section='fields').

Citations_search_citations_minimalA

Minimal citation search for discovery (90-95% context reduction).

Use for high-volume pattern discovery before detailed analysis. Essential 8 fields: application, publication, art unit, citation ID, category, tech center, date, examiner indicator.

Solr/Lucene Query Examples:

  • Field search: criteria='groupArtUnitNumber:2854'

  • Date range: criteria='officeActionDate:[2017-10-01 TO *]'

  • Boolean: criteria='citationCategoryCode:X AND techCenter:2100'

  • Wildcard: criteria='citedDocumentIdentifier:US*'

  • Combined: criteria='groupArtUnitNumber:2854 AND officeActionDate:[2023-01-01 TO 2023-12-31]'

Ultra-minimal mode: Pass custom fields list for 99% token reduction (2-3 fields only). Example: fields=['citedDocumentIdentifier', 'patentApplicationNumber'] for PFW integration.

Date handling: USPTO documents this API as office actions mailed 2017-10-01 to ~30 days ago. In practice ~44% of TC2100 records carry an earlier officeActionDate (verified against PFW document dates back to 2010-2012). Do NOT add a blanket officeActionDate:[2017-10-01 TO *] clause unless you specifically want the documented window — it discards records the index actually serves.

Lane routing — TRY BOTH: this is the ENRICHED lane (passage locations, claim mapping, quality scores, NPL flag, date filtering). For completeness-sensitive questions also run Citations_search_oa_citations_minimal (raw 892/1449 lists, statutory basis, broader applicant-IDS coverage) and union the results — neither lane is a superset of the other. See Citations_get_guidance(section='oa_citations').

CROSS-LANE JOIN KEY: every row carries referenceKey, the normalised reference identifier, and it is the ONLY correct key for unioning this lane with the OA lane. The two lanes write the same reference differently: on app 12849948 the OA parsedReferenceIdentifier reads '20060075466' while the enriched citedDocumentIdentifier reads 'US 2006/0075466 A1'. Joining those two raw fields finds zero overlap on every application; the true answer there is four references in both lanes. referenceKey is digits only (a leading US, spaces, slashes, hyphens and the kind code stripped, series markers such as RE kept), derived from publicationNumber first and citedDocumentIdentifier second, and carried on both lanes at every tier including a custom fields list.

ROWS WITH NO REFERENCE: referenceKey is null when the row carries no usable identifier, and the response envelope reports how many such rows the page holds as rows_without_reference_identifier (always present, 0 included). An absent citedDocumentIdentifier key, a null one and an empty string are ONE state, not three: a row can carry an empty publicationNumber with the citedDocumentIdentifier key missing from the JSON entirely. Measured: 2 of 5 on app 11752072, 4 of 8 on 12849948, 4 of 26 on 18407147. Those rows are real citations and must be reported as unresolved, never dropped.

IDENTIFIERS: patent_number takes either a GRANTED patent number (7-8 digits; commas, spaces and a US prefix are accepted) or an 11-digit pre-grant publication number. A granted patent number is crosswalked to its application serial with one USPTO ODP applications-search call and queried as patentApplicationNumber; an 11-digit value queries publicationNumber directly. The response reports which reading was used in patent_number_resolution {input, interpreted_as, resolved_application_number when crosswalked, source}. A number that resolves to no application is a 400 naming the accepted forms, not a zero-result. application_number remains the application serial; passing one that disagrees with the crosswalked patent number is also a 400.

Note: Returns citation metadata only. For the office action text itself, use the PFW MCP's PFW_get_oa_text / PFW_get_oa_rejections (direct, no document-bag + OCR round trip).

For complex workflows and cross-MCP integration, use Citations_get_guidance(section). Quick reference: 'fields' section for Solr syntax, 'workflows_pfw' for PFW integration.

Citations_search_citations_balancedA

Balanced citation search for analysis (80-85% context reduction). Prior art references cited by an examiner, cited passage, column and line locator, figure, mapped claim, art unit, tech center, examiner vs applicant citation.

Use after minimal search for detailed study of selected citations (10-20 results). 19 fields including passages, claims, office action category.

Solr/Lucene Query Examples:

  • Field search: criteria='groupArtUnitNumber:2854'

  • Date range: criteria='officeActionDate:[2023-01-01 TO 2023-12-31]'

  • Boolean: criteria='(citationCategoryCode:X OR citationCategoryCode:Y) AND techCenter:2100'

  • NPL only: criteria='nplIndicator:true AND techCenter:2100'

  • Complex: criteria='groupArtUnitNumber:2854 AND citationCategoryCode:X AND officeActionDate:[2020-01-01 TO *]'

NOT searchable: examinerNameText and firstApplicantNameText do NOT exist on this API. Examiner queries 400; applicant queries silently return 0. Resolve examiners and applicants through the PFW MCP, then query citations by application number.

Ultra-minimal mode: Pass custom fields list for 99% token reduction (2-3 fields only). Example: fields=['citedDocumentIdentifier', 'citationCategoryCode', 'passageLocationText']

Date handling: documented window is office actions mailed 2017-10-01 to ~30 days ago, but ~44% of TC2100 records carry an earlier officeActionDate in practice. Add an officeActionDate:[2017-10-01 TO *] clause only when you want the documented window specifically. For completeness, also query the OA lane and union.

Convenience parameters (balanced mode only):

  • decision_type: Office action type — use "CTNF" (non-final rejection) or "CTFR" (final rejection)

  • category_code: Citation relevance code — X (anticipatory §102/103), Y (combined §103), A (background)

  • examiner_cited: Boolean filter for examiner-cited references (true/false)

  • art_unit: Group art unit number (e.g., '2128', '3600')

CROSS-LANE JOIN KEY: every row carries referenceKey, the normalised reference identifier, and it is the ONLY correct key for unioning this lane with the OA lane. The two lanes write the same reference differently: on app 12849948 the OA parsedReferenceIdentifier reads '20060075466' while the enriched citedDocumentIdentifier reads 'US 2006/0075466 A1'. Joining those two raw fields finds zero overlap on every application; the true answer there is four references in both lanes. referenceKey is digits only (a leading US, spaces, slashes, hyphens and the kind code stripped, series markers such as RE kept), derived from publicationNumber first and citedDocumentIdentifier second, and carried on both lanes at every tier including a custom fields list.

ROWS WITH NO REFERENCE: referenceKey is null when the row carries no usable identifier, and the response envelope reports how many such rows the page holds as rows_without_reference_identifier (always present, 0 included). An absent citedDocumentIdentifier key, a null one and an empty string are ONE state, not three: a row can carry an empty publicationNumber with the citedDocumentIdentifier key missing from the JSON entirely. Measured: 2 of 5 on app 11752072, 4 of 8 on 12849948, 4 of 26 on 18407147. Those rows are real citations and must be reported as unresolved, never dropped.

IDENTIFIERS: patent_number takes either a GRANTED patent number (7-8 digits; commas, spaces and a US prefix are accepted) or an 11-digit pre-grant publication number. A granted patent number is crosswalked to its application serial with one USPTO ODP applications-search call and queried as patentApplicationNumber; an 11-digit value queries publicationNumber directly. The response reports which reading was used in patent_number_resolution {input, interpreted_as, resolved_application_number when crosswalked, source}. A number that resolves to no application is a 400 naming the accepted forms, not a zero-result. application_number remains the application serial; passing one that disagrees with the crosswalked patent number is also a 400.

Note: Returns citation metadata only. For the office action text itself, use the PFW MCP's PFW_get_oa_text / PFW_get_oa_rejections (direct, no document-bag + OCR round trip).

For complex workflows and cross-MCP integration, use Citations_get_guidance(section). Quick reference: 'oa_citations' for OA-vs-enriched routing, 'fields' for Solr syntax, 'workflows_pfw'/'workflows_ptab'/'workflows_fpd' for integration patterns.

Citations_get_citation_detailsA

Get complete details for specific citation by ID. Full record for one citation, all fields, cited passage, column and line locator, figure, mapped claim, quality summary.

Use for deep analysis of strategically important citations. Full record with all fields and complete citing context.

⚠️ IMPORTANT: Returns citation METADATA only, NOT actual documents.

2-STEP PFW MCP WORKFLOW: Step 1: PFW_get_application_documents(app_number='{app_number}', document_code='CTNF', limit=20)

Document Code Decoder:

  • CTNF: Non-Final Office Action (where most citations appear — start here)

  • CTFR: Final Office Action Rejection

  • NOA: Notice of Allowance

  • 892: Examiner's Search Strategy & Citations List

  • IDS: Applicant's Information Disclosure Statement

Step 2a (LLM analysis): PFW_get_document_content_with_ocr(app_number, document_identifier) → Extract text for analysis Step 2b (User download): PFW_get_document_download(app_number, document_identifier) → PDF download link

For complete cross-MCP workflows, use Citations_get_guidance(section='workflows_pfw') for detailed integration patterns.

Citations_validate_queryA

Validate Lucene query syntax and provide optimization suggestions. Check my query, syntax error, is this query valid, Lucene, Solr, escaping, dry run before searching, why did my search fail.

Solr/Lucene Syntax Examples:

  • Field search: 'groupArtUnitNumber:2854'

  • Date range: 'officeActionDate:[2023-01-01 TO 2023-12-31]'

  • Boolean operators: 'citationCategoryCode:X AND techCenter:2100'

  • OR logic: '(citationCategoryCode:X OR citationCategoryCode:Y)'

  • NOT operator: 'techCenter:2100 NOT groupArtUnitNumber:1600'

  • Wildcard: 'citedDocumentIdentifier:US*'

  • NPL only: 'nplIndicator:true'

  • Open-ended range: 'officeActionDate:[2017-10-01 TO *]'

For comprehensive query syntax guide, use Citations_get_guidance(section='fields').

Citations_get_citation_statisticsA

Get database statistics and aggregations for strategic planning. Counts, totals, aggregate, how many, distribution, breakdown by art unit or tech center, trends over time, citation volume.

⚠️ ENRICHED LANE ONLY. This tool aggregates the Enriched Citations (v3) index and nothing else. criteria is validated against the enriched field whitelist, so an OA-only clause (legalSectionCode, actionTypeCategory, paragraphNumber, referenceIdentifier, parsedReferenceIdentifier, workGroup) is a 400 here rather than a wrong answer, and there is no lane parameter: the OA Citations (v2) index has no statistics path on this server. That is a documented limit, not a bug to work around by rephrasing the clause.

To aggregate the OA lane, count it yourself with the OA search tools and read response.numFound, which is the whole-result total and not the page size: Citations_search_oa_citations_minimal(criteria='techCenter:2100 AND legalSectionCode:103', rows=1) One call per bucket gives the same breakdown shape this tool returns for the enriched lane. Any cross-lane comparison must state which lane each number came from; the two indexes are independent and neither is a superset of the other.

Returns for the enriched lane: total_citations, examiner_cited_count, applicant_cited_count, and breakdowns by citation category (X/Y/A) and by who cited.

Citations_get_guidanceA

Get selective USPTO Citation guidance sections for context-efficient workflows

🎯 QUICK REFERENCE - What section for your question?

🔍 "Find citations by examiner/application/tech" → fields 🔀 "Which lane: OA citations or enriched citations?" → oa_citations 📄 "Understand citation categories (X/Y/A + NPL via nplIndicator)" → citation_codes 🔖 "Citation date coverage per lane" → data_coverage 🤝 "PFW workflow for office action documents" → workflows_pfw 🚩 "PTAB citation correlation" → workflows_ptab (updated for 2026 PTAB API) 📊 "FPD petition citation patterns" → workflows_fpd 🏢 "Complete lifecycle analysis" → workflows_complete ⚙️ "Tool guidance and parameters" → tools ❌ "Search errors or query issues" → errors 💰 "Reduce API costs and optimize" → cost

Available sections:

  • overview: Available sections and tool summary

  • workflows_pfw: Citation + PFW integration workflows

  • workflows_ptab: Citation + PTAB integration workflows (updated 2026-01-17)

  • workflows_fpd: Citation + FPD integration workflows

  • workflows_complete: Four-MCP complete lifecycle analysis

PTAB Integration (updated 2026-01-17):

  • Trials: PTAB_search_trials_minimal/balanced/complete

  • Documents: PTAB_get_documents, PTAB_get_document_download, PTAB_get_document_content

  • See: Citations_get_guidance(section='workflows_ptab') for integration patterns

  • citation_codes: X/Y/A category decoder; NPL identified by nplIndicator:true field

  • oa_citations: OA (v2) vs enriched (v3) routing rule, measured coverage, field matrix

  • data_coverage: per-lane date coverage and date handling

  • fields: Field selection strategies and Solr/Lucene syntax

  • tools: Tool-specific guidance and parameters

  • errors: Common error patterns and troubleshooting

  • cost: Cost optimization strategies

Citations_search_oa_citations_minimalA

Search Office Action Citations (v2) for high-volume discovery (8 key fields).

OA Citations v2 is the raw citation list transcribed from Form PTO-892 (examiner) and Form PTO-1449 (applicant IDS). Usually broader than the enriched lane in bulk (measured TC2100: 4.87M vs 4.32M records), with most of the surplus being applicant IDS references — but NOT a superset: on a given application the enriched lane can return more (measured: app 12849948 returns 4 here vs 8 enriched). For any completeness-sensitive question, run BOTH lanes and union the results.

⚠️ APPLICANT-CITED (1449/IDS) COVERAGE IS PARTIAL. This lane is documented upstream as transcribing Form 892 AND Form 1449, but on IDS-heavy files it returns close to what the examiner applied and little else, in every era. Measured against the patents' own References Cited pages (union of BOTH lanes): US 7,971,071 -> 5 of 91 US 9,496,922 -> 1 of 251 US 9,135,462 -> 0 of about 620 (both lanes return zero) US 11,656,067 -> 3 of 15, prosecuted 2021-2023 INSIDE the documented window, and all three are the examiner's own double-patenting family citations, none of them the twelve references a later IPR petition relied on. Treat a reference's absence here as NO evidence that the applicant did not disclose it, and never present a count from this lane as the applicant's full IDS. For a complete 1449 record, read the IDS documents themselves through the PFW MCP.

Key fields returned: patentApplicationNumber, groupArtUnitNumber, techCenter, referenceIdentifier, parsedReferenceIdentifier, actionTypeCategory, examinerCitedReferenceIndicator, createDateTime. The OA API ignores fl, so this set is enforced client-side — the tier really does return only these eight. The PFW hand-off is stated once on the response envelope as pfw_link, not repeated on every row. legalSectionCode and paragraphNumber are NOT here; use the balanced tier or pass an explicit fields list for them.

CROSS-LANE JOIN KEY: every row carries referenceKey, the normalised reference identifier, and it is the ONLY correct key for unioning this lane with the enriched lane. The two lanes write the same reference differently: on app 12849948 this lane's parsedReferenceIdentifier reads '20060075466' while the enriched citedDocumentIdentifier reads 'US 2006/0075466 A1'. Joining those two raw fields finds zero overlap on every application; the true answer there is four references in both lanes. referenceKey is digits only (a leading US, spaces, slashes, hyphens and the kind code stripped, series markers such as RE kept), derived from parsedReferenceIdentifier first and the raw referenceIdentifier second, and carried on both lanes at every tier including a custom fields list. It is null on a row whose identifier does not reduce to a document number, which is an unjoinable row rather than a missing one.

Solr/Lucene Query Examples:

  • By application: criteria='patentApplicationNumber:18180061'

  • By tech center: criteria='techCenter:2100'

  • By art unit: criteria='groupArtUnitNumber:2854'

  • Examiner-cited only: criteria='examinerCitedReferenceIndicator:true'

  • Statutory basis (OA-ONLY capability): criteria='techCenter:2100 AND legalSectionCode:103'

  • Where a patent was cited: criteria='parsedReferenceIdentifier:9280610'

⚠️ NO DATE FIELD. officeActionDate does not exist here and returns HTTP 400 — the index already IS the 2017-10-01+ window, so omit any date clause. createDateTime is an ETL load stamp, NOT the office action date — never present it as prosecution chronology.

⚠️ publicationNumber IN criteria IS A DELIBERATE 400 HERE, AND THAT IS A FEATURE. The raw upstream API does not reject that field: it answers HTTP 200 with numFound 0, which reads exactly like "this patent was never cited" and is silently wrong. This server refuses the clause instead so the mistake is visible. Use the patent_number parameter, which crosswalks a granted patent number to the application serial this index does hold, or query parsedReferenceIdentifier to find where a patent was CITED.

⚠️ Use parsedReferenceIdentifier (normalized) rather than referenceIdentifier for reference lookups — the raw string format varies for the same patent.

IDENTIFIERS: application_number is the APPLICATION serial. This index has no patent-number field (publicationNumber returns HTTP 400), so patent_number is crosswalked here: pass a GRANTED patent number (7-8 digits; commas, spaces and a US prefix accepted) and it is resolved to its application serial with one USPTO ODP applications-search call, then queried as patentApplicationNumber. The response reports the mapping in patent_number_resolution {input, interpreted_as, resolved_application_number, source}. An 11-digit pre-grant publication number is refused here (use Citations_search_citations_minimal for those), an unresolvable number is a 400 naming the accepted forms, and a patent_number that disagrees with a supplied application_number is a 400 rather than a query that can only return zero.

Use Citations_search_oa_citations_balanced for full 16-field detail (adds legalSectionCode, paragraphNumber, parsedReferenceIdentifier). For passage locations, claim mapping, NPL flags, or date filtering, use Citations_search_citations_minimal — and run it alongside this tool by default. Coverage: USPTO documents both APIs as office actions mailed 2017-10-01 to ~30 days ago; in practice both have been observed serving older records, so do not treat an older application as out of scope without querying. Routing detail: Citations_get_guidance(section='oa_citations').

Citations_search_oa_citations_balancedA

Search Office Action Citations (v2) with all 16 available fields. Prior art cited against an application, Form 892, Form 1449, IDS references, 102 103 112 statutory basis, action type, paragraph number.

Use after Citations_search_oa_citations_minimal for detailed analysis of selected applications. All fields: patentApplicationNumber, groupArtUnitNumber, techCenter, referenceIdentifier, parsedReferenceIdentifier, actionTypeCategory, legalSectionCode, examinerCitedReferenceIndicator, applicantCitedExaminerReferenceIndicator, officeActionCitationReferenceIndicator, workGroup, paragraphNumber, createDateTime, createUserIdentifier, obsoleteDocumentIdentifier, id.

This tier is where the OA-only analytical fields live: legalSectionCode (102/103/112 statutory basis) and actionTypeCategory ('rejected') have no equivalent in the enriched lane, and paragraphNumber locates the citation within the office action.

⚠️ APPLICANT-CITED (1449/IDS) COVERAGE IS PARTIAL. This lane is documented upstream as transcribing Form 892 AND Form 1449, but on IDS-heavy files it returns close to what the examiner applied and little else, in every era. Measured against the patents' own References Cited pages (union of BOTH lanes): US 7,971,071 -> 5 of 91 US 9,496,922 -> 1 of 251 US 9,135,462 -> 0 of about 620 US 11,656,067 -> 3 of 15, prosecuted 2021-2023 INSIDE the documented window A reference's absence here is NO evidence that the applicant did not disclose it, and a count from this lane is not the applicant's full IDS. For a complete 1449 record, read the IDS documents through the PFW MCP.

CROSS-LANE JOIN KEY: every row carries referenceKey, the normalised reference identifier, and it is the ONLY correct key for unioning this lane with the enriched lane. On app 12849948 this lane's parsedReferenceIdentifier reads '20060075466' while the enriched citedDocumentIdentifier reads 'US 2006/0075466 A1'; joining those two raw fields finds zero overlap on every application, when the true answer there is four references in both lanes. referenceKey is digits only (a leading US, spaces, slashes, hyphens and the kind code stripped, series markers such as RE kept) and is carried on both lanes at every tier. It is null on a row whose identifier does not reduce to a document number.

OA Citations v2 documented window: office actions mailed 2017-10-01 to ~30 days prior to today (older records have been observed in practice). No office-action date field exists — do not add an officeActionDate clause (HTTP 400).

⚠️ publicationNumber IN criteria IS A DELIBERATE 400 HERE, AND THAT IS A FEATURE. The raw upstream API answers that field with HTTP 200 and numFound 0, which reads as "this patent was never cited" and is silently wrong. This server refuses the clause so the mistake is visible. Use the patent_number parameter for the subject patent, or parsedReferenceIdentifier to find where a patent was CITED.

IDENTIFIERS: application_number is the APPLICATION serial. This index has no patent-number field (publicationNumber returns HTTP 400), so patent_number is crosswalked here: pass a GRANTED patent number (7-8 digits; commas, spaces and a US prefix accepted) and it is resolved to its application serial with one USPTO ODP applications-search call, then queried as patentApplicationNumber. The response reports the mapping in patent_number_resolution {input, interpreted_as, resolved_application_number, source}. An 11-digit pre-grant publication number is refused here (use Citations_search_citations_balanced for those), an unresolvable number is a 400 naming the accepted forms, and a patent_number that disagrees with a supplied application_number is a 400 rather than a query that can only return zero.

Citations_get_oa_citation_fieldsA

Get all searchable fields from the USPTO Office Action Citations API v2. Fields, available fields, columns, schema, what can I query, field names, query syntax for the OA citations lane.

Returns the complete field list for building Lucene queries against the OA Citations dataset. OA Citations v2 is the simpler counterpart to the AI-enriched citations — it provides raw citation data from Form 892 and Form 1449 office actions.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription
citation_results_view
oa_citations_view
statistics_view
user_management_view

TDQS

A4.4/5.0

Scored across 10 tools

Disambiguation5/5

Each tool targets a clearly distinct function: field discovery, search per lane/tier, detail lookup, query validation, statistics, and guidance. The enriched vs OA lane split and minimal vs balanced tiers are explicitly and repeatedly disambiguated in the descriptions.

Naming Consistency5/5

All tools share the Citations_ prefix and follow a consistent snake_case verb_noun pattern, with modifiers like minimal/balanced and lane qualifiers like oa applied uniformly. The naming makes the tool relationships and purposes predictable.

Tool Count5/5

Ten tools is well-scoped for a patent citation search domain: two search tiers across two data lanes, field discovery, detail retrieval, validation, statistics, and guidance. Each tool serves a distinct part of the workflow without redundancy.

Completeness5/5

The surface covers the full read-only citation lifecycle: field discovery, query validation, minimal and balanced search on both citation lanes, detailed record retrieval, and aggregate statistics. Cross-MCP handoffs to PFW and PTAB are also documented, so agents are not left at dead ends.

Maintenance

ActivitySlowing
ResponsivenessNo issues