Skip to main content
Glama

Search Patents

search_patents
Read-onlyIdempotent

Search USPTO patent applications and grants — without a granted_after/granted_before bound this returns the APPLICATION corpus sorted newest-FILED-first, not issued patents. USPTO publishes an application ~18 months after filing and typically takes 2+ years to grant it, so the newest rows in an unfiltered search are always recent, unexamined filings with grant_date: null — that is expected, not stale data. Pick the date field on the QUESTION'S VERB, not on the word "recent": a question asking who has FILED / applied for / sought patents in a window wants filed_after/filed_before — the default application corpus already includes pending AND granted patents, so no granted_after is needed or wanted, and adding one will silently drop recently-filed-but-not-yet-examined applications (grant lags filing by 2+ years, so "filed in the last 3 years" AND "granted in the last 3 years" are mostly DISJOINT sets). Only use granted_after/granted_before when the question explicitly says GRANTED / ISSUED / APPROVED / "has a patent" (not just "recent patents"). Use query for free-text keywords ("lithium battery", "crispr", "machine learning"); all terms are required (AND), and you can quote a phrase to keep it together. A curated, short list of known synonym/abbreviation pairs for concepts that patents describe inconsistently (e.g. cfRNA / cell-free RNA / circulating RNA; MRD / minimal residual disease / residual cancer) is recognized in query — quoted or bare — and expanded to an OR group before the search runs, so "cfRNA" and "cell-free RNA" are treated as the same concept rather than requiring the caller to guess a specific patent's exact wording (marked synonyms_expanded: true in the response; this is a fixed, documented list, not general synonym invention). A question that names several DISTINCT ways of describing the same idea (e.g. a condition plus a detection method, each expressed as its own quoted phrase) should still be passed as one query — if the literal AND-of-everything match returns zero, the tool automatically retries once with those same quoted phrases OR'd together instead and marks the response broadened: true; it only ever relaxes multi-phrase AND to OR on a genuine zero, so a search that is narrow for a real reason (e.g. one specific applicant with no matching filings, or an ordinary bare-keyword AND) still correctly returns zero. Optional structured filters: applicant (exact corporate name as filed, e.g. "APPLE INC."), inventor (person name), title (words in the invention title), number (a specific application number), filed_after / filed_before, granted_after / granted_before. Common synonyms are understood — assignee, company and owner all reach applicant, and keywords, q or text all reach query. Results include title, application number, filing date, first applicant, all applicants, inventors, status, classification. total is the full match count but USPTO returns at most 25 records per search — narrow with applicant or a date range rather than raising limit. Powered by the USPTO Open Data Portal (data.uspto.gov).

Example tool call

This call uses example arguments supplied in the tool’s input schema.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "query": "\"cell-free RNA\"",
      "filed_after": "2023-09-25",
      "filed_before": "2026-09-25"
    },
    "name": "search_patents"
  }
}

Input Schema

NameRequiredDescriptionDefault
limitNoNumber of results to return (default 10). USPTO caps every search at 25 records, so values above 25 have no effect — use the filters to narrow instead.
queryNoFree-text keywords. Every term must appear (they are AND-ed), so add words to narrow and remove words to widen. Wrap words in double quotes to require them adjacent: `"machine learning" model` needs the exact phrase plus the word model. Examples: "lithium battery", "crispr", "neural network". Pass "*" if you only want to filter by applicant/date with no keyword constraint. A curated set of known synonyms/abbreviations (e.g. cfRNA / cell-free RNA / circulating RNA, or MRD / minimal residual disease / residual cancer) is automatically expanded to an OR group within the query — quoted or bare, either form is recognized — so you do not need to guess which exact wording a given patent uses (see `synonyms_expanded` in the response). If several quoted phrases — or two recognized synonym-group concepts, quoted or not — ANDed together still match nothing, the tool retries once with them OR'd instead (see `broadened` in the response) rather than returning a bare zero.
titleNoOptional. Words that must appear in the invention title, which narrows far harder than `query` does since `query` searches the whole record. Example: "solid state battery".
numberNoOptional. A specific US application number, digits only or formatted — "16123456" or "16/123,456". Accepted synonyms: `application_number`, `patent_number`.
_apiKeyNoUSPTO ODP API key. Get free at https://data.uspto.gov/myodp. Falls back to platform key if configured.
inventorNoOptional. Inventor name, matched against ALL named inventors (not just the first); "Geoffrey Hinton" or "Hinton, Geoffrey" matches "Geoffrey E. Hinton" (middle initials tolerated), a bare surname matches any inventor with it. Each row carries `matching_inventor`, the inventor who matched. Examples: "Geoffrey Hinton", "Bengio". Accepted synonyms: `inventor_name`, `author`.
applicantNoOptional. Company applicant name as it appears on the USPTO filing. This is also how to list the patents a company OWNS or holds ("patents assigned to X", "X's patents", "patents owned by X"): set `applicant`, with `query` "*" if there is no keyword. **Must include the exact corporate suffix** the company uses (PBC / Inc. / LLC / Corporation / Co. / NV / AG / KK). A wrong or missing suffix matches nothing — "Apple" returns zero where "APPLE INC." returns hundreds. Examples: "Anthropic, PBC" (not "Anthropic Inc."), "Apple Inc." (not "Apple"), "Alphabet Inc." (not "Google"), "Meta Platforms, Inc." (not "Facebook"), "Microsoft Corporation" (not "Microsoft Corp."). If you get zero results plus a `warning` field, the name form is wrong rather than the company being absent — retry with a different corporate form.
filed_afterNoOptional. Filter to patents FILED on/after this date (ISO YYYY-MM-DD). Use this for "who has filed / applied for patents on X (recently / in the last N years)" — it covers both pending applications and already-granted patents, so it is the right bound even when the question also says "recent". Do NOT substitute `granted_after` for a filing-activity question: grant lags filing by 2+ years, so a recent filing window under `granted_after` typically returns zero even when filing activity is real.
filed_beforeNoOptional. Filter to patents FILED on/before this date (ISO YYYY-MM-DD).
granted_afterNoOptional. Filter to patents GRANTED (issued) on/after this date (ISO YYYY-MM-DD) — use ONLY when the question explicitly says GRANTED / ISSUED / APPROVED, not for a plain "recent patents" or "who has filed" question (use `filed_after` for those — see its description). Accepted synonym: `issued_after`.
granted_beforeNoOptional. Filter to patents GRANTED (issued) on/before this date (ISO YYYY-MM-DD). Accepted synonym: `issued_before`.

Output Schema

NameRequiredDescriptionDefault
noteNoPresent when total exceeds the returned records — explains the 25-record ODP page cap
queryYesThe composed ODP query string actually sent
totalYesTotal number of matching applications (USPTO ODP returns at most 25 records per search regardless of limit)
filtersYesEcho of the structured filters applied; each is null when unused
patentsYesSame records with full ODP fields
resultsYesBack-compat summary shape (title, number, dates, applicant)
warningNoPresent when an applicant filter matched nothing — ODP matches the corporate name literally ("APPLE INC." not "Apple")
returnedYesNumber of records in this response

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / inventor / description
      Previous value: -"Optional. Inventor name as recorded on the filing; a last name matches most reliably. Examples: \"Hinton\", \"Bengio\". Accepted synonyms: `inventor_name`, `author`."New value: +"Optional. Inventor name, matched against ALL named inventors (not just the first); \"Geoffrey Hinton\" or \"Hinton, Geoffrey\" matches \"Geoffrey E. Hinton\" (middle initials tolerated), a bare surname matches any inventor with it. Each row carries `matching_inventor`, the inventor who matched. Examples: \"Geoffrey Hinton\", \"Bengio\". Accepted synonyms: `inventor_name`, `author`."
  2. Changed1 schema field changed
    • changedInput schema / properties / applicant / description
      Previous value: -"Optional. Company applicant name as it appears on the USPTO filing. **Must include the exact corporate suffix** the company uses (PBC / Inc. / LLC / Corporation / Co. / NV / AG / KK). A wrong or missing suffix matches nothing — \"Apple\" returns zero where \"APPLE INC.\" returns hundreds. Examples: \"Anthropic, PBC\" (not \"Anthropic Inc.\"), \"Apple Inc.\" (not \"Apple\"), \"Alphabet Inc.\" (not \"Google\"), \"Meta Platforms, Inc.\" (not \"Facebook\"), \"Microsoft Corporation\" (not \"Microsoft Corp.\"). If you get zero results plus a `warning` field, the name form is wrong rather than the company being absent — retry with a different corporate form."New value: +"Optional. Company applicant name as it appears on the USPTO filing. This is also how to list the patents a company OWNS or holds (\"patents assigned to X\", \"X's patents\", \"patents owned by X\"): set `applicant`, with `query` \"*\" if there is no keyword. **Must include the exact corporate suffix** the company uses (PBC / Inc. / LLC / Corporation / Co. / NV / AG / KK). A wrong or missing suffix matches nothing — \"Apple\" returns zero where \"APPLE INC.\" returns hundreds. Examples: \"Anthropic, PBC\" (not \"Anthropic Inc.\"), \"Apple Inc.\" (not \"Apple\"), \"Alphabet Inc.\" (not \"Google\"), \"Meta Platforms, Inc.\" (not \"Facebook\"), \"Microsoft Corporation\" (not \"Microsoft Corp.\"). If you get zero results plus a `warning` field, the name form is wrong rather than the company being absent — retry with a different corporate form."
  3. Changed5 schema fields changed
    • changedInput schema / examples
      Previous value: -[
      -  {
      -    "query": "machine learning neural networks"
      -  },
      -  {
      -    "query": "blockchain cryptocurrency"
      -  },
      -  {
      -    "applicant": "APPLE INC."
      -  },
      -  {
      -    "inventor": "Hinton",
      -    "query": "neural"
      -  }
      -]New value: +[
      +  {
      +    "filed_after": "2023-09-25",
      +    "filed_before": "2026-09-25",
      +    "query": "\"cell-free RNA\""
      +  },
      +  {
      +    "query": "machine learning neural networks"
      +  },
      +  {
      +    "query": "blockchain cryptocurrency"
      +  },
      +  {
      +    "applicant": "APPLE INC."
      +  },
      +  {
      +    "inventor": "Hinton",
      +    "query": "neural"
      +  }
      +]
    • changedInput schema / properties / filed_after / description
      Previous value: -"Optional. Filter to patents filed on/after this date (ISO YYYY-MM-DD)."New value: +"Optional. Filter to patents FILED on/after this date (ISO YYYY-MM-DD). Use this for \"who has filed / applied for patents on X (recently / in the last N years)\" — it covers both pending applications and already-granted patents, so it is the right bound even when the question also says \"recent\". Do NOT substitute `granted_after` for a filing-activity question: grant lags filing by 2+ years, so a recent filing window under `granted_after` typically returns zero even when filing activity is real."
    • changedInput schema / properties / filed_before / description
      Previous value: -"Optional. Filter to patents filed on/before this date (ISO YYYY-MM-DD)."New value: +"Optional. Filter to patents FILED on/before this date (ISO YYYY-MM-DD)."
    • changedInput schema / properties / granted_after / description
      Previous value: -"Optional. Filter to patents GRANTED (issued) on/after this date (ISO YYYY-MM-DD). This is the argument that answers \"recent/latest patents\" — without it, results are unexamined applications, not issued patents. Accepted synonym: `issued_after`."New value: +"Optional. Filter to patents GRANTED (issued) on/after this date (ISO YYYY-MM-DD) — use ONLY when the question explicitly says GRANTED / ISSUED / APPROVED, not for a plain \"recent patents\" or \"who has filed\" question (use `filed_after` for those — see its description). Accepted synonym: `issued_after`."
    • changedInput schema / properties / query / description
      Previous value: -"Free-text keywords. Every term must appear (they are AND-ed), so add words to narrow and remove words to widen. Wrap words in double quotes to require them adjacent: `\"machine learning\" model` needs the exact phrase plus the word model. Examples: \"lithium battery\", \"crispr\", \"neural network\". Pass \"*\" if you only want to filter by applicant/date with no keyword constraint."New value: +"Free-text keywords. Every term must appear (they are AND-ed), so add words to narrow and remove words to widen. Wrap words in double quotes to require them adjacent: `\"machine learning\" model` needs the exact phrase plus the word model. Examples: \"lithium battery\", \"crispr\", \"neural network\". Pass \"*\" if you only want to filter by applicant/date with no keyword constraint. A curated set of known synonyms/abbreviations (e.g. cfRNA / cell-free RNA / circulating RNA, or MRD / minimal residual disease / residual cancer) is automatically expanded to an OR group within the query — quoted or bare, either form is recognized — so you do not need to guess which exact wording a given patent uses (see `synonyms_expanded` in the response). If several quoted phrases — or two recognized synonym-group concepts, quoted or not — ANDed together still match nothing, the tool retries once with them OR'd instead (see `broadened` in the response) rather than returning a bare zero."
  4. Changed2 schema fields changed
    • changedInput schema / properties / granted_after / description
      Previous value: -"Optional. Filter to patents granted on/after this date (ISO YYYY-MM-DD)."New value: +"Optional. Filter to patents GRANTED (issued) on/after this date (ISO YYYY-MM-DD). This is the argument that answers \"recent/latest patents\" — without it, results are unexamined applications, not issued patents. Accepted synonym: `issued_after`."
    • changedInput schema / properties / granted_before / description
      Previous value: -"Optional. Filter to patents granted on/before this date (ISO YYYY-MM-DD)."New value: +"Optional. Filter to patents GRANTED (issued) on/before this date (ISO YYYY-MM-DD). Accepted synonym: `issued_before`."
  5. Changed14 schema fields changed
    • changedInput schema / examples
      Previous value: -[
      -  {
      -    "query": "machine learning neural networks"
      -  },
      -  {
      -    "query": "blockchain cryptocurrency"
      -  }
      -]New value: +[
      +  {
      +    "query": "machine learning neural networks"
      +  },
      +  {
      +    "query": "blockchain cryptocurrency"
      +  },
      +  {
      +    "applicant": "APPLE INC."
      +  },
      +  {
      +    "inventor": "Hinton",
      +    "query": "neural"
      +  }
      +]
    • addedInput schema / properties / inventor
      Added value: +{
      +  "description": "Optional. Inventor name as recorded on the filing; a last name matches most reliably. Examples: \"Hinton\", \"Bengio\". Accepted synonyms: `inventor_name`, `author`.",
      +  "type": "string"
      +}
    • addedInput schema / properties / number
      Added value: +{
      +  "description": "Optional. A specific US application number, digits only or formatted — \"16123456\" or \"16/123,456\". Accepted synonyms: `application_number`, `patent_number`.",
      +  "type": "string"
      +}
    • addedInput schema / properties / title
      Added value: +{
      +  "description": "Optional. Words that must appear in the invention title, which narrows far harder than `query` does since `query` searches the whole record. Example: \"solid state battery\".",
      +  "type": "string"
      +}
    • addedOutput schema / properties / filters
      Added value: +{
      +  "description": "Echo of the structured filters applied; each is null when unused",
      +  "properties": {
      +    "applicant": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "filed_after": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "filed_before": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "granted_after": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "granted_before": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / note
      Added value: +{
      +  "description": "Present when total exceeds the returned records — explains the 25-record ODP page cap",
      +  "type": "string"
      +}
    • changedOutput schema / properties / patents / description
      Previous value: -"List of patent summaries"New value: +"Same records with full ODP fields"
    • changedOutput schema / properties / query / description
      Previous value: -"The search query used"New value: +"The composed ODP query string actually sent"
    • addedOutput schema / properties / results
      Added value: +{
      +  "description": "Back-compat summary shape (title, number, dates, applicant)",
      +  "items": {
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / returned / description
      Previous value: -"Number of patents in this response"New value: +"Number of records in this response"
    • addedOutput schema / properties / total
      Added value: +{
      +  "description": "Total number of matching applications (USPTO ODP returns at most 25 records per search regardless of limit)",
      +  "type": "number"
      +}
    • removedOutput schema / properties / total_results
      Removed value: -{
      -  "description": "Total number of matching patents",
      -  "type": "number"
      -}
    • addedOutput schema / properties / warning
      Added value: +{
      +  "description": "Present when an applicant filter matched nothing — ODP matches the corporate name literally (\"APPLE INC.\" not \"Apple\")",
      +  "type": "string"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "query",
      -  "total_results",
      -  "returned",
      -  "patents"
      -]New value: +[
      +  "query",
      +  "filters",
      +  "total",
      +  "returned",
      +  "results",
      +  "patents"
      +]
  6. Changed3 schema fields changed
    • changedInput schema / properties / applicant / description
      Previous value: -"Optional. Company applicant name as it appears on the USPTO filing. **Must include the exact corporate suffix** the company uses (PBC / Inc. / LLC / Corporation / Co. / NV / AG / KK). Wrong suffix = ODP silently returns the whole unfiltered pool, not zero. Examples: \"Anthropic, PBC\" (not \"Anthropic Inc.\"), \"Apple Inc.\" (not \"Apple\"), \"Alphabet Inc.\" (not \"Google\"), \"Meta Platforms, Inc.\" (not \"Facebook\"), \"Microsoft Corporation\" (not \"Microsoft Corp.\"). If you get a `warning` field back, the filter missed — retry with a different corporate form."New value: +"Optional. Company applicant name as it appears on the USPTO filing. **Must include the exact corporate suffix** the company uses (PBC / Inc. / LLC / Corporation / Co. / NV / AG / KK). A wrong or missing suffix matches nothing — \"Apple\" returns zero where \"APPLE INC.\" returns hundreds. Examples: \"Anthropic, PBC\" (not \"Anthropic Inc.\"), \"Apple Inc.\" (not \"Apple\"), \"Alphabet Inc.\" (not \"Google\"), \"Meta Platforms, Inc.\" (not \"Facebook\"), \"Microsoft Corporation\" (not \"Microsoft Corp.\"). If you get zero results plus a `warning` field, the name form is wrong rather than the company being absent — retry with a different corporate form."
    • changedInput schema / properties / limit / description
      Previous value: -"Number of results (1–100, default 10)."New value: +"Number of results to return (default 10). USPTO caps every search at 25 records, so values above 25 have no effect — use the filters to narrow instead."
    • changedInput schema / properties / query / description
      Previous value: -"Free-text search across title/abstract/inventor/etc. Examples: \"lithium battery\", \"crispr\", \"neural network\". Pass \"*\" if you only want to filter by applicant/date with no keyword constraint."New value: +"Free-text keywords. Every term must appear (they are AND-ed), so add words to narrow and remove words to widen. Wrap words in double quotes to require them adjacent: `\"machine learning\" model` needs the exact phrase plus the word model. Examples: \"lithium battery\", \"crispr\", \"neural network\". Pass \"*\" if you only want to filter by applicant/date with no keyword constraint."
  7. Changed1 schema field changed
    • changedInput schema / examples
      Previous value: -[
      -  {
      -    "query": "machine learning neural networks"
      -  },
      -  {
      -    "per_page": 20,
      -    "query": "blockchain cryptocurrency"
      -  }
      -]New value: +[
      +  {
      +    "query": "machine learning neural networks"
      +  },
      +  {
      +    "query": "blockchain cryptocurrency"
      +  }
      +]
  8. Changed2 schema fields changed
    • addedInput schema / examples
      Added value: +[
      +  {
      +    "query": "machine learning neural networks"
      +  },
      +  {
      +    "per_page": 20,
      +    "query": "blockchain cryptocurrency"
      +  }
      +]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "patents": {
      +      "description": "List of patent summaries",
      +      "items": {
      +        "properties": {
      +          "assignee_organization": {
      +            "description": "Assignee organization name or null",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "date": {
      +            "description": "Patent filing date or null",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "inventors": {
      +            "description": "List of inventors",
      +            "items": {
      +              "properties": {
      +                "first_name": {
      +                  "description": "Inventor first name or null",
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "last_name": {
      +                  "description": "Inventor last name or null",
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "patent_number": {
      +            "description": "Patent number",
      +            "type": "string"
      +          },
      +          "title": {
      +            "description": "Patent title",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "patent_number",
      +          "title",
      +          "date",
      +          "inventors",
      +          "assignee_organization"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "query": {
      +      "description": "The search query used",
      +      "type": "string"
      +    },
      +    "returned": {
      +      "description": "Number of patents in this response",
      +      "type": "number"
      +    },
      +    "total_results": {
      +      "description": "Total number of matching patents",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "query",
      +    "total_results",
      +    "returned",
      +    "patents"
      +  ],
      +  "type": "object"
      +}
  9. Changed1 schema field changed
    • changedInput schema / properties / applicant / description
      Previous value: -"Optional. Company applicant name. Use the canonical ALL-CAPS form (e.g., \"APPLE INC.\", \"GOOGLE LLC\", \"MICROSOFT CORPORATION\"). Lower-case forms work poorly. Filtering is approximate."New value: +"Optional. Company applicant name as it appears on the USPTO filing. **Must include the exact corporate suffix** the company uses (PBC / Inc. / LLC / Corporation / Co. / NV / AG / KK). Wrong suffix = ODP silently returns the whole unfiltered pool, not zero. Examples: \"Anthropic, PBC\" (not \"Anthropic Inc.\"), \"Apple Inc.\" (not \"Apple\"), \"Alphabet Inc.\" (not \"Google\"), \"Meta Platforms, Inc.\" (not \"Facebook\"), \"Microsoft Corporation\" (not \"Microsoft Corp.\"). If you get a `warning` field back, the filter missed — retry with a different corporate form."
  10. Changed7 schema fields changed
    • addedInput schema / properties / applicant
      Added value: +{
      +  "description": "Optional. Company applicant name. Use the canonical ALL-CAPS form (e.g., \"APPLE INC.\", \"GOOGLE LLC\", \"MICROSOFT CORPORATION\"). Lower-case forms work poorly. Filtering is approximate.",
      +  "type": "string"
      +}
    • addedInput schema / properties / filed_after
      Added value: +{
      +  "description": "Optional. Filter to patents filed on/after this date (ISO YYYY-MM-DD).",
      +  "type": "string"
      +}
    • addedInput schema / properties / filed_before
      Added value: +{
      +  "description": "Optional. Filter to patents filed on/before this date (ISO YYYY-MM-DD).",
      +  "type": "string"
      +}
    • addedInput schema / properties / granted_after
      Added value: +{
      +  "description": "Optional. Filter to patents granted on/after this date (ISO YYYY-MM-DD).",
      +  "type": "string"
      +}
    • addedInput schema / properties / granted_before
      Added value: +{
      +  "description": "Optional. Filter to patents granted on/before this date (ISO YYYY-MM-DD).",
      +  "type": "string"
      +}
    • changedInput schema / properties / query / description
      Previous value: -"Free-text search query — plain keywords only. Examples: \"lithium battery\", \"crispr\", \"neural network\". Field-prefix syntax (e.g. applicantName:X) is not supported and will return an error."New value: +"Free-text search across title/abstract/inventor/etc. Examples: \"lithium battery\", \"crispr\", \"neural network\". Pass \"*\" if you only want to filter by applicant/date with no keyword constraint."
    • removedInput schema / required
      Removed value: -[
      -  "query"
      -]
  11. Changed2 schema fields changed
    • removedInput schema / examples
      Removed value: -[
      -  {
      -    "query": "machine learning neural networks"
      -  },
      -  {
      -    "per_page": 20,
      -    "query": "blockchain cryptocurrency"
      -  }
      -]
    • changedOutput schema / (root)
      Previous value: -{
      -  "properties": {
      -    "patents": {
      -      "description": "List of patent summaries",
      -      "items": {
      -        "properties": {
      -          "assignee_organization": {
      -            "description": "Assignee organization name or null",
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "date": {
      -            "description": "Patent filing date or null",
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "inventors": {
      -            "description": "List of inventors",
      -            "items": {
      -              "properties": {
      -                "first_name": {
      -                  "description": "Inventor first name or null",
      -                  "type": [
      -                    "string",
      -                    "null"
      -                  ]
      -                },
      -                "last_name": {
      -                  "description": "Inventor last name or null",
      -                  "type": [
      -                    "string",
      -                    "null"
      -                  ]
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          "patent_number": {
      -            "description": "Patent number",
      -            "type": "string"
      -          },
      -          "title": {
      -            "description": "Patent title",
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "patent_number",
      -          "title",
      -          "date",
      -          "inventors",
      -          "assignee_organization"
      -        ],
      -        "type": "object"
      -      },
      -      "type": "array"
      -    },
      -    "query": {
      -      "description": "The search query used",
      -      "type": "string"
      -    },
      -    "returned": {
      -      "description": "Number of patents in this response",
      -      "type": "number"
      -    },
      -    "total_results": {
      -      "description": "Total number of matching patents",
      -      "type": "number"
      -    }
      -  },
      -  "required": [
      -    "query",
      -    "total_results",
      -    "returned",
      -    "patents"
      -  ],
      -  "type": "object"
      -}New value: +null
  12. Changed1 schema field changed
    • changedInput schema / properties / query / description
      Previous value: -"Search query. Examples: \"lithium battery\", \"applicantName:\\\"Apple Inc.\\\"\", \"inventionTitle:crispr\", \"firstInventorName:smith\". USPTO ODP uses simplified query syntax (see https://data.uspto.gov/documents/documents/ODP-API-Query-Spec.pdf)."New value: +"Free-text search query — plain keywords only. Examples: \"lithium battery\", \"crispr\", \"neural network\". Field-prefix syntax (e.g. applicantName:X) is not supported and will return an error."
  13. Changed4 schema fields changed
    • addedInput schema / properties / _apiKey
      Added value: +{
      +  "description": "USPTO ODP API key. Get free at https://data.uspto.gov/myodp. Falls back to platform key if configured.",
      +  "type": "string"
      +}
    • addedInput schema / properties / limit
      Added value: +{
      +  "description": "Number of results (1–100, default 10).",
      +  "type": "number"
      +}
    • removedInput schema / properties / per_page
      Removed value: -{
      -  "description": "Number of results to return (default 10, max 25)",
      -  "type": "number"
      -}
    • changedInput schema / properties / query / description
      Previous value: -"Keyword or phrase to search in patent abstracts"New value: +"Search query. Examples: \"lithium battery\", \"applicantName:\\\"Apple Inc.\\\"\", \"inventionTitle:crispr\", \"firstInventorName:smith\". USPTO ODP uses simplified query syntax (see https://data.uspto.gov/documents/documents/ODP-API-Query-Spec.pdf)."
  14. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "patents": {
      +      "description": "List of patent summaries",
      +      "items": {
      +        "properties": {
      +          "assignee_organization": {
      +            "description": "Assignee organization name or null",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "date": {
      +            "description": "Patent filing date or null",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "inventors": {
      +            "description": "List of inventors",
      +            "items": {
      +              "properties": {
      +                "first_name": {
      +                  "description": "Inventor first name or null",
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "last_name": {
      +                  "description": "Inventor last name or null",
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "patent_number": {
      +            "description": "Patent number",
      +            "type": "string"
      +          },
      +          "title": {
      +            "description": "Patent title",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "patent_number",
      +          "title",
      +          "date",
      +          "inventors",
      +          "assignee_organization"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "query": {
      +      "description": "The search query used",
      +      "type": "string"
      +    },
      +    "returned": {
      +      "description": "Number of patents in this response",
      +      "type": "number"
      +    },
      +    "total_results": {
      +      "description": "Total number of matching patents",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "query",
      +    "total_results",
      +    "returned",
      +    "patents"
      +  ],
      +  "type": "object"
      +}
  15. Changed1 schema field changed
    • addedInput schema / examples
      Added value: +[
      +  {
      +    "query": "machine learning neural networks"
      +  },
      +  {
      +    "per_page": 20,
      +    "query": "blockchain cryptocurrency"
      +  }
      +]
  16. First observed

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/idempotent/openWorld annotations: discloses the default sort order (newest-filed-first), the 25-record hard cap, the automatic single retry that relaxes multi-phrase AND to OR on a zero, the curated synonym expansion, and the `warning` field returned when an applicant name form is wrong. These are non-obvious behaviors that materially affect how an agent should call and interpret the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded and well-organized, but the filed-vs-granted warning is made three separate times with heavy bold/caps emphasis, and the synonym and broadening behavior is restated from the schema. It is information-dense to the point of redundancy, which costs scanability for an agent parsing it once.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A complex, filter-heavy tool with 11 optional params, and the definition covers corpus defaults, date-field selection, name matching, synonym handling, fallback behavior, and result-size limits. Return values are covered by the output schema, so nothing material is left out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the per-parameter descriptions already carry most guidance, so much of the description is restatement. It still adds real semantic value: the verb-driven selection rule for the date fields and the non-obvious consequence that adding a grant bound silently drops recently-filed applications.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Search USPTO patent applications and grants') and immediately qualifies the corpus being searched, which is the key disambiguation. It is clearly distinguishable from siblings like get_patent (single record) and search_patent_assignments (ownership records) without needing their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit, testable routing rules: use filed_after/filed_before for filing-activity questions, reserved granted_after/granted_before only when the question says GRANTED/ISSUED/APPROVED. It also explains why (filing and grant windows are largely disjoint) and warns about the silent failure mode of choosing the wrong bound.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.