query_trademarks
Search US trademarks from USPTO data by mark text, owner name, class, status, or date range to verify availability and check registrations.
Instructions
Search US trademarks from the USPTO. Filter by mark text, owner name, international class, status, and filing/registration date range. Source: USPTO TSDR and bulk XML data, updated weekly.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| mark_text | No | Trademark text/name (partial match, e.g. 'APPLE') | |
| owner_name | No | Trademark owner/applicant name (partial match) | |
| international_class | No | Nice Classification code (e.g. '009' for computers/electronics) | |
| status | No | Trademark status (e.g. REGISTERED, PENDING, ABANDONED, CANCELLED) | |
| date_from | No | Start date for filing/registration (YYYY-MM-DD) | |
| date_to | No | End date for filing/registration (YYYY-MM-DD) | |
| limit | No | Maximum results to return (default 25, max 100) |
Implementation Reference
- src/tools/trademarks.ts:31-104 (handler)The 'query_trademarks' tool is registered and implemented within 'registerTrademarkTools' in 'src/tools/trademarks.ts'. It uses a Zod schema for input validation and performs an asynchronous API call to fetch trademark data.
server.registerTool( "query_trademarks", { title: "Query Trademarks", description: "Search US trademarks from the USPTO. Filter by mark text, owner name, " + "international class, status, and filing/registration date range. " + "Source: USPTO TSDR and bulk XML data, updated weekly.", inputSchema: { mark_text: z .string() .optional() .describe("Trademark text/name (partial match, e.g. 'APPLE')"), owner_name: z .string() .optional() .describe("Trademark owner/applicant name (partial match)"), international_class: z .string() .optional() .describe("Nice Classification code (e.g. '009' for computers/electronics)"), status: z .string() .optional() .describe("Trademark status (e.g. REGISTERED, PENDING, ABANDONED, CANCELLED)"), date_from: z .string() .optional() .describe("Start date for filing/registration (YYYY-MM-DD)"), date_to: z .string() .optional() .describe("End date for filing/registration (YYYY-MM-DD)"), limit: z .number() .int() .min(1) .max(100) .optional() .describe("Maximum results to return (default 25, max 100)"), }, }, async ({ mark_text, owner_name, international_class, status, date_from, date_to, limit }) => { const res = await apiGet<TrademarkQueryResponse>("/api/v1/trademarks", { mark_text, owner_name, international_class, status, date_from, date_to, limit: limit ?? 25, }); if (!res.ok) { return { content: [ { type: "text" as const, text: `API error (${res.status}): ${JSON.stringify(res.data)}`, }, ], isError: true, }; } const { count, data } = res.data; const summary = `Found ${count} trademark(s).`; const json = JSON.stringify(data, null, 2); return { content: [{ type: "text" as const, text: `${summary}\n\n${json}` }], }; }, );