Skip to main content
Glama

Search Trademarks

search_trademarks
Read-onlyIdempotent

Search US federal trademarks by mark text — the clearance/knockout-search path. Find registered and pending marks by wordmark without knowing a serial or registration number, then filter by international class and live/dead status to see which marks are actually enforceable. Also finds every mark held by a company: pass owner (e.g. "Nike") to list the trademark portfolio of a brand owner. Covers the full USPTO register (the Trademark Search system that replaced TESS). Keyless. Use this to check whether a proposed brand name conflicts with existing US trademarks. Returns wordmark, serial and registration numbers, status, live flag, international classes, goods/services, owners of record with role and entity type, attorney of record, filing dates, and data_as_of (when USPTO last loaded each record). For a name-availability check, set live_only:true and pass the relevant class (e.g. 35 for advertising/business, 42 for software/SaaS, 9 for downloadable software).

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": "TenderBrief",
      "live_only": true,
      "international_class": "35"
    },
    "name": "search_trademarks"
  }
}

Input Schema

NameRequiredDescriptionDefault
limitNoResults per page, 1-50 (default 20).
ownerNoOwner-name filter (e.g. "Nike", "Mondelez"). Pass owner alone (no query) to list that owner's whole portfolio.
queryNoMark text to screen (e.g. "TenderBrief"). Matches the wordmark field. Required unless owner is given. Advanced: pass fielded Lucene (e.g. 'wordmark:apple AND ownerName:"Apple Inc"') and it is used verbatim.
offsetNoPagination offset (default 0).
live_onlyNoIf true, return only live marks (registered or pending) — the set that can actually block a new application. Default false (includes dead/abandoned/cancelled).
international_classNoOptional Nice class filter. Accepts "35", 35, "IC 035", or "035". Common: 9 (software), 35 (advertising/business/retail), 42 (SaaS/tech services).

Output Schema

NameRequiredDescriptionDefault
noteNoPresent only when total_matches is 0. States what the query did NOT search, so absence in this index is not read as absence of blocking rights.
countYesRows in this response
queryYes
offsetYes
sourceYes
clearedNoPresent only when total_matches is 0. Always null: a knockout search cannot establish that a mark is available, so we never assert it is clear.
resultsYes
deliveryNo
data_as_ofNoNewest USPTO load timestamp among the returned records
total_matchesYes
total_is_cappedNoTrue when total_matches hit the upstream cap and is a floor, not an exact count

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed10 schema fields changed
    • changedInput schema / examples
      Previous value: -[
      -  {
      -    "international_class": "35",
      -    "live_only": true,
      -    "query": "TenderBrief"
      -  },
      -  {
      -    "international_class": "9",
      -    "limit": 10,
      -    "live_only": true,
      -    "query": "wordmark:apple AND ownerName:\"Apple Inc\""
      -  }
      -]New value: +[
      +  {
      +    "international_class": "35",
      +    "live_only": true,
      +    "query": "TenderBrief"
      +  },
      +  {
      +    "international_class": "9",
      +    "limit": 10,
      +    "live_only": true,
      +    "query": "wordmark:apple AND ownerName:\"Apple Inc\""
      +  },
      +  {
      +    "limit": 3,
      +    "live_only": true,
      +    "owner": "Nike"
      +  }
      +]
    • changedInput schema / properties / owner / description
      Previous value: -"Optional owner-name filter (matches ownerName)."New value: +"Owner-name filter (e.g. \"Nike\", \"Mondelez\"). Pass owner alone (no query) to list that owner's whole portfolio."
    • changedInput schema / properties / query / description
      Previous value: -"Mark text to screen (e.g. \"TenderBrief\"). Matches the wordmark field. Advanced: pass fielded Lucene (e.g. 'wordmark:apple AND ownerName:\"Apple Inc\"') and it is used verbatim."New value: +"Mark text to screen (e.g. \"TenderBrief\"). Matches the wordmark field. Required unless owner is given. Advanced: pass fielded Lucene (e.g. 'wordmark:apple AND ownerName:\"Apple Inc\"') and it is used verbatim."
    • removedInput schema / required
      Removed value: -[
      -  "query"
      -]
    • addedOutput schema / properties / data_as_of
      Added value: +{
      +  "description": "Newest USPTO load timestamp among the returned records",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / delivery
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / results / items / properties / attorney_of_record
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / data_as_of
      Added value: +{
      +  "description": "When USPTO last loaded this record into the register index",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / owners_of_record
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "citizenship": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "entity_type": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "location": {
      +        "description": "City / state / country for organisations only; always null for natural persons. Street addresses are never served.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "natural_person": {
      +        "type": "boolean"
      +      },
      +      "role": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / results / items / properties / wordmark / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
  2. Changed2 schema fields changed
    • addedOutput schema / properties / cleared
      Added value: +{
      +  "description": "Present only when total_matches is 0. Always null: a knockout search cannot establish that a mark is available, so we never assert it is clear.",
      +  "type": [
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / note
      Added value: +{
      +  "description": "Present only when total_matches is 0. States what the query did NOT search, so absence in this index is not read as absence of blocking rights.",
      +  "type": [
      +    "string"
      +  ]
      +}
  3. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "description": "USPTO trademark search. A zero-hit search returns the same shape with results:[] and count:0.",
      +  "properties": {
      +    "count": {
      +      "description": "Rows in this response",
      +      "type": "number"
      +    },
      +    "offset": {
      +      "type": "number"
      +    },
      +    "query": {
      +      "type": "string"
      +    },
      +    "results": {
      +      "items": {
      +        "properties": {
      +          "abandon_date": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "filed_date": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "goods_services": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "international_classes": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "live": {
      +            "type": "boolean"
      +          },
      +          "mark_type": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "owner": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "registration_date": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "registration_number": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "serial_number": {
      +            "type": "string"
      +          },
      +          "status": {
      +            "type": "string"
      +          },
      +          "status_code": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "url": {
      +            "type": "string"
      +          },
      +          "wordmark": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "wordmark",
      +          "serial_number",
      +          "status",
      +          "live"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "total_is_capped": {
      +      "description": "True when total_matches hit the upstream cap and is a floor, not an exact count",
      +      "type": "boolean"
      +    },
      +    "total_matches": {
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "source",
      +    "query",
      +    "total_matches",
      +    "count",
      +    "offset",
      +    "results"
      +  ],
      +  "type": "object"
      +}
  4. Changed1 schema field changed
    • addedInput schema / examples
      Added value: +[
      +  {
      +    "international_class": "35",
      +    "live_only": true,
      +    "query": "TenderBrief"
      +  },
      +  {
      +    "international_class": "9",
      +    "limit": 10,
      +    "live_only": true,
      +    "query": "wordmark:apple AND ownerName:\"Apple Inc\""
      +  }
      +]
  5. Added

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover readOnly/idempotent/openWorld/destructive. The description adds real context beyond them: keyless access, coverage of the full USPTO register (TESS replacement), and an explanation of data_as_of freshness. It also enumerates return fields, which with an output schema is partly redundant, keeping it just short of 5.

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

Conciseness4/5

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

Front-loaded with the core purpose and the differentiating constraint, and each sentence adds a distinct fact. However the long enumeration of return fields duplicates the output schema and inflates length, so not fully maximally concise.

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?

Given rich annotations and a full output schema, the description covers everything an agent needs: what it searches, coverage/source, freshness semantics, and the parameter recipes for the primary use case. Nothing material is missing.

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%, so baseline 3, but the description adds meaning beyond it: owner can be passed alone for a portfolio listing, and live_only should be paired with a class for availability checks, with concrete class mappings (35=advertising, 42=SaaS, 9=software). This is genuinely additive guidance rather than restating the schema.

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?

States a specific verb+resource ('Search US federal trademarks by mark text') and immediately scopes it as the clearance/knockout path, distinguishing it from the serial/registration lookup siblings by noting it works 'without knowing a serial or registration number'. An agent can distinguish it from get_trademark_by_serial and get_trademark_by_registration without opening any schema.

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 when-to-use: 'check whether a proposed brand name conflicts with existing US trademarks', plus a concrete alternative workflow (pass owner alone to list a portfolio). It even prescribes parameter recipes for the availability check (live_only:true + class 35/42/9), leaving little to inference.

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.