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. Covers the full USPTO register (the tmsearch.uspto.gov Elasticsearch backend 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, owner, and filing dates. 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).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoResults per page, 1-50 (default 20).
ownerNoOptional owner-name filter (matches ownerName).
queryYesMark 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.
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

TableJSON 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
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. 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"
      +  ]
      +}
  2. 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"
      +}
  3. 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\""
      +  }
      +]
  4. Added

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly/idempotent/openWorld annotations, the description adds meaningful behavioral context: it covers the full USPTO register, names the Elasticsearch backend that replaced TESS, notes there is no API key, and explains that live_only reflects the set of marks that can actually block a new application. This gives an agent useful expectations about scope, source, and enforcement relevance.

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

Conciseness5/5

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

The description is dense but every sentence earns its place: state the tool's purpose, clarify scope, mention keyless access, give the canonical use case, list return fields, and provide a concrete usage recipe. It front-loads the core purpose and does not waste words on restating the schema.

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?

For a search tool with six parameters, rich annotations, and an output schema, the description is complete. It covers when to use it, what data it returns, how to filter for enforceability, common class examples, and the underlying data source, leaving no gap an agent needs to guess about before calling the tool.

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 the baseline is 3, but the description adds practical parameter guidance beyond the schema by recommending live_only:true and specific Nice classes for a name-availability check. It also reinforces the semantic distinction between live and dead marks, which helps an agent choose the right filter value.

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?

The description opens with a specific verb and resource: 'Search US federal trademarks by mark text' and clearly frames the tool as the clearance/knockout-search path. It distinguishes itself from number-based lookup tools like get_trademark_by_registration and get_trademark_by_serial by explicitly noting it works 'without knowing a serial or registration number.'

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

Usage Guidelines4/5

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

The description gives strong context: use it to check whether a proposed brand name conflicts with existing marks, and it gives concrete configuration advice for name-availability checks. It stops short of explicitly naming alternative tools for when a serial or registration number is already known, though the contrast is strongly implied and siblings reveal the alternatives.

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.