Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,070Paid calls: 1,528Letters: 13Defects: 1,322counted 3 min ago
teppi

Server definition

Hash
sha256:9df8470d8463d5b1c680c324d576dd726bc318a4b065b34e5b27b4f9d94485e2
What it is
What a remote MCP server returned when asked what it offers: 64 tools

The blob, as servednamed by its sha256

{ "instructions": "GleanMark provides access to 14M USPTO trademark records.\n\nLINKING: successful tool results end with a \"GleanMark pages\" list (marks by serial number, owners, TTAB proceedings). When your answer cites one of them, link its name or number to that page as a Markdown link — in tables and in prose. Use only the URLs provided; never construct or guess one.\n\n## Tool Catalog\n\n**Search & Discovery:**\n- `search_trademarks` — keyword search across 14M marks\n- `get_similar_marks` — find similar marks using phonetic + text similarity\n- `phonetic_search` — find marks that sound alike (Metaphone + trigram)\n- `compare_marks` — compare two marks for likelihood of confusion\n- `lookup_trademark` — look up a specific mark by serial number (basic info only — no prosecution events)\n- `search_by_owner` — find all marks owned by a specific entity\n- `search_attorneys` — find trademark attorneys/firms\n- `resolve_trademark_subject` — resolve an ambiguous owner, firm, correspondent, mark, proceeding, client, or portfolio name before deeper work\n- `get_nice_classes` — get Nice classification descriptions\n- `suggest_gs_descriptions` — search the USPTO ID Manual for pre-approved (surcharge-free) goods/services identifications; call once per distinct product/service line\n- `validate_gs_description` — check a draft G&S description clause-by-clause against the ID Manual (verbatim / close / free-form)\n- `get_owner_ttab_stats` — TTAB litigation history for a SINGLE owner\n- `get_ttab_top_opposition_filers` — market-wide ranking of who filed the most TTAB oppositions/cancellations in a date range\n- `get_chain_of_title` — who has owned a mark over time: USPTO's recorded ownership stages plus any recorded assignments\n- `get_owner_related_parties` — entities likely affiliated with an owner (predecessors, subsidiaries, sister companies) from shared USPTO ownership history and filing addresses; evidence + confidence per hit, never a merge\n- `search_ttab_proceedings` — general TTAB proceeding discovery by party, proceeding number, trademark serial, or registration number, with status/type/role filters\n- `search_claimed_colors` — count/rank/list marks by the colours they CLAIM (parsed from USPTO colour-claim statements; TESS never offered this). Two levels: family (red covers maroon, burgundy) and exact shade (dark red). match=only for \"claims exactly these colours\". claimed=false counts colour DISCLAIMERS. mode=vocabulary lists the valid terms. Use this for color-only questions.\n- `search_design_codes` — exact USPTO design-code lookup and membership search (26.17.01 = straight bands). USPTO says \"bands\", never \"stripes\", and has no code word for \"swoosh\" — call mode=search_codes with a plain shape word FIRST, then count/list. by_serial accepts a serial or registration number.\n- `search_design_similarity` — find similar design/combined marks, optionally intersected with claimed-color families or exact shades. An uploaded-image URL or existing serial/registration uses true image-to-image similarity; a description and/or design codes uses semantic design similarity with code-overlap boosting. Returns mark images and color claims. Requires authentication.\n- `search_mark_statements` — disclaimers (\"no claim to PIZZA\"), drawing descriptions (\"the mark consists of a red and white striped awning\"), translations, and prior-registration claims. Answers \"which marks disclaim X\" / \"which marks are described as stripes\". Colour has its own tool; goods are in search_trademarks.\n- `get_owner_ttab_enforcement` — one-call owner enforcement slice for initiated opposition/cancellation counts, date ranges, target mark types, target Nice classes, coverage, and proceeding details; extensions remain separate\n- `get_event_code_reference` — decode USPTO event codes\n- `get_event_status_mapping` — look up which status code and status definition most commonly follow a USPTO event code\n- `get_deadline_satisfaction_mapping` — check whether a USPTO event code satisfies a specific deadline type such as office action response, opposition period, Section 8, or Section 15\n- `get_mark_deadlines` — public, system-generated action deadlines for one specific mark\n- `get_owner_deadlines` — public, system-generated action deadlines across one owner's marks\n- `get_firm_deadlines` — public, system-generated action deadlines across marks handled by one law firm\n- `get_reference_lookup` — look up small USPTO and TTAB reference/code tables such as statuses, statement types, legal entity types, drawing codes, and TTAB role/status/entry codes\n- `get_class_relationships` — look up coordinated Nice classes or curated related Nice classes for one class number\n- `run_knockout_search` — pure USPTO conflict search (examiner-style: phonetic + coordinated classes + trigram + component decomposition). Marks only — does not check domains or brand availability. Usually finishes in under a minute.\n\n**Workspace (requires authentication):**\n- `get_my_clients` — list your clients\n- `get_client_portfolios` — list portfolios for a client\n- `get_portfolio_marks` — list trademarks in a portfolio with full details + facets (status/class/type breakdowns)\n- `get_my_tracked_owners` — list owners you're monitoring with portfolio stats, TTAB stats, entity info, and health score\n- `get_upcoming_deadlines` — upcoming action-required trademark deadlines\n- `get_workspace_recent_office_actions` — latest Office Actions actually issued across all accessible GleanMark portfolios, including matters already answered and each mark's portfolio name(s)\n- `get_workspace_deadlines` — action-required docketed trademark deadlines in the active workspace with client/portfolio filters, custom deadlines, completion-state filters, and explicit informational-window control\n- `get_workspace_ttab_deadlines` — TTAB proceeding deadlines in the active workspace with client/portfolio filters and plaintiff/defendant narrowing\n- `get_recent_alerts` — recent monitoring alerts\n- `get_portfolio_attention` — summarize what needs attention across the accessible workspace, a client, or a portfolio in 3 buckets: Needs Response, Deadlines, and Potential Threats\n- `summarize_client` — AI summary of a client's trademark portfolio\n- `summarize_portfolio` — AI summary of a specific portfolio\n- `get_client_ttab_activity` — TTAB proceedings for a client's marks with party names, roles, and involved mark names (accepts client UUID or client name)\n- `analyze_portfolio_risk` — deadline and maintenance watch across accessible portfolios (accepts client UUID or client name)\n\n**Analytics & Research:**\n- `get_top_filers` — top filers by owner, correspondent, or firm for a class/date window\n- `count_filings_by_period` — count U.S. trademark applications filed across the whole register by calendar year, month or day, with the Madrid split and period-over-period change\n- `get_firm_top_correspondents` — rank the correspondents or attorneys inside one named law firm by filing volume\n- `get_firm_correspondent_tasks` — action-required deadlines plus recent Office Actions for one law firm, with ROA and §2(d) indicators\n- `get_firm_oa_outcomes` — mark-level OA-to-registration outcomes for one law firm, with raw and resolved-case rates\n- `get_correspondent_specialization` — summarize a named correspondent's top clients, top classes, and prosecution-versus-TTAB profile\n- `get_mark_owner_landscape` — crowded owner-landscape summary for a shared mark term across many owners\n- `count_trademarks_by_attributes` — purpose-built counts by record attributes such as Nice classes, canonical drawing type, standard-character status, and live/registered status; it can also handle cross-attribute intersections\n- `run_safe_analytics` — shared-safe fallback for bespoke rankings, counts, snapshots, and timelines about a named OWNER, FIRM, or CORRESPONDENT. It cannot query arbitrary mark attributes such as claimed colors or drawing type.\n\n**AI-Powered Deep Analysis (these call LLMs — use judiciously, warn user about wait times):**\n- `analyze_ttab_proceeding` — deep analysis of a TTAB case with document review (~1-2 min)\n- `get_ttab_proceeding_analysis_status` — check whether previously launched TTAB proceeding analysis is pending or complete and fetch the completed cached result\n- `research_ttab_pleadings` — batch research over actual TTABVUE notice/petition PDFs and optional answers; classifies pleaded theories or searches exact terms across an owner/date cohort\n- `get_ttab_pleading_research_status` — check a batch TTAB pleading-research job and fetch its evidence-backed, paginated result\n- `get_owner_ai_summary` — strategic analysis of an owner's trademark portfolio (~30s)\n- `get_mark_ai_summary` — AI-powered deep dive on a specific trademark (~30s)\n- `run_dupont_analysis` — §2(d) likelihood-of-confusion analysis between two marks, using the same du Pont doctrine as the \"§2(d) Likelihood of Confusion\" section of a GleanMark clearance memo. Directional conclusions per factor, **no numeric scores**. **Synchronous** — it returns the finished analysis (~30-60s)\n- `analyze_prosecution_history` — AI narrative of a mark's prosecution timeline (~1 min)\n- `get_prosecution_history_status` — check whether previously launched prosecution history analysis for a serial is pending or complete and fetch the completed cached result\n- `research_office_action` — research cited marks and coexistence evidence for an OA (~1-2 min)\n- `get_office_action_research_status` — check whether previously launched Office Action research for a serial is pending, complete, expired, or failed and fetch the completed cached result\n\n**Data & Research:**\n- `get_prosecution_timeline` — chronological prosecution events for a mark (raw data, no AI)\n- `get_mark_prosecution_summary` — compact prosecution summary for one mark with latest OA/response dates and milestones\n- `list_prosecution_documents` — prosecution document inventory for one mark\n- `get_prosecution_document` — retrieve/read one selected prosecution document with its USPTO link and extraction status\n- `get_latest_office_action` — latest office action and latest response for one mark\n- `get_mark_international_profile` — foreign / Madrid Protocol footprint of a U.S. mark: international registration (IR number, date, status, renewal), 66(a) basis, Madrid maintenance (§8/§15), and the foreign applications/registrations claimed as priority/basis (country, registration number, dates). USPTO-sourced; only for marks with a USPTO record\n- `get_ttab_proceeding_details` — parties, involved marks, TTAB counsel/correspondent rows, filings, and events for a TTAB case (raw data)\n- `get_ttab_document` — retrieve/read one TTAB filing by proceeding + entry number with TTABVUE/PDF links\n- `list_ttab_decisions` — Board opinions on file for a date or date range (one day, a week, a month): case title, mailed date, precedential or not, how the proceeding ended (from the interpretation layer), the defendant's marks, plus how many proceedings the docket shows ended by Board decision in that window and how many of those were defaults\n- `search_ttab_opinions` — full-text search over the Board opinions on file (precedential by default; websearch syntax) for a doctrine, phrase, or issue such as fraud, materiality, specimens, dilution, or genericness — returns ranked opinions with keyword snippets and the count of non-precedential matches\n- `verify_ttab_holdings` — check what you are about to say a TTAB decision held against that decision's own text, before you say it; returns a verdict per claim and what each verdict lets you say\n- `get_owner_filing_trends` — yearly filing counts by Nice class for an owner\n- `get_owner_goods_keywords` — top goods/services keywords for an owner (word cloud data)\n- `search_oa_cases` — search historical office action / response cases with filters for refusal types, subtypes, examiner, outcome, and analysis status\n- `get_oa_case_detail` — detailed office action case bundle for one serial number or OA document, including round metadata and cited-mark context\n- `get_cited_mark_history` — citation history of ONE cited mark: every parsed Office Action that cited that registration (or pending application) against other applicants, grouped by refused application, with what happened to each (registered later / abandoned / pending), the structured outcome where a final action recorded one (withdrawn / obviated / maintained), and whether response text is on file\n- `recommend_nice_classes` — suggest Nice classes for a business description\n- `web_research` — research a company, mark, or legal topic on the internet (grounded with citations)\n- `check_domain_availability` — check domain status for a brand name\n- `check_brand_availability` — quick SCREEN combining domain status + a trademark conflict signal, with a screening tier. Not a clearance search and never an availability answer\n\n## Tool Selection (CRITICAL — cost awareness)\n- **Quick check vs deep analysis:** Use `compare_marks` for quick similarity scoring. Use `run_dupont_analysis` only when the user explicitly asks for a full DuPont or likelihood of confusion analysis — it costs 10-50x more.\n- **DuPont follow-up:** `run_dupont_analysis` is synchronous — there is no job to poll and no status tool. When it returns, you have the analysis. Do not rerun `run_dupont_analysis` unless the user explicitly asks for a new analysis.\n- **Async prosecution follow-up:** After `analyze_prosecution_history` or the prosecution summary workflow has been launched for a serial, use `get_prosecution_history_status` when the user asks whether the analysis is done or wants the completed result. Do not rerun `analyze_prosecution_history` unless the user explicitly asks for a fresh rerun.\n- **Office Action research follow-up:** After `research_office_action` has been launched for a serial, use `get_office_action_research_status` when the user asks whether the research is done or wants the completed result. Do not rerun `research_office_action` unless the user explicitly asks for a fresh rerun.\n- **TTAB async follow-up:** After `analyze_ttab_proceeding` has been launched for a proceeding, use `get_ttab_proceeding_analysis_status` when the user asks whether the analysis is done or wants the completed result. Do not rerun `analyze_ttab_proceeding` unless the user explicitly asks for a fresh rerun.\n- **TTAB pleading-research follow-up:** After `research_ttab_pleadings` returns a job id, use `get_ttab_pleading_research_status` for status/results. Reuse the job id from the conversation and paginate while `has_more=true`; do not relaunch the research unless the user asks for a new scope.\n- **Data first, AI second:** Use `get_prosecution_timeline` for raw prosecution data. Use `analyze_prosecution_history` only when the user wants a narrative summary or strategic insights, and use `get_prosecution_history_status` for status or completed-result follow-ups on previously launched prosecution analysis.\n- **Prosecution summary first:** For \"what happened in prosecution\" or \"give me the latest status/OA/response\" on a known serial number, prefer `get_mark_prosecution_summary` and `get_latest_office_action` before AI tools.\n- **Document inventory:** For \"show the documents\" or \"what documents are in the file history\" on a known serial number, use `list_prosecution_documents`. If the user names one document or asks what it says, follow with `get_prosecution_document` using its stable document id. Use `text_query` for a particular issue and include the returned USPTO link.\n- **TTAB data vs analysis:** Use `get_ttab_proceeding_details` for raw parties, involved marks, TTAB counsel/correspondents, and filings. Use `analyze_ttab_proceeding` only for AI-powered case analysis with argument assessment, and use `get_ttab_proceeding_analysis_status` for completed-result or status follow-ups on previously launched TTAB analysis.\n- **Specific TTAB filing:** When the user identifies a filing, date, motion, complaint, answer, or entry in one proceeding, use `get_ttab_proceeding_details` to identify its entry number and then `get_ttab_document` to read it. Include the returned TTABVUE link; do not infer filing text from the activity label.\n- **Board decisions by DATE (\"what did the TTAB decide on August 27\", \"decisions issued last week\", \"recent precedential decisions this year\")** → `list_ttab_decisions` with date_from/date_to (same date for one day). Report the opinions on file by case title, proceeding number, mailed date and precedential status, and separately the docket count of proceedings ended by Board decision in that window with its default share. Never say the Board issued nothing that day — say nothing more is on file at GleanMark, and offer the USPTO Reading Room for the complete list.\n- **Board opinions by TOPIC (\"precedential TTAB decisions on fraud\", \"recent decisions about specimens and materiality\", \"what has the Board said about X\")** → `search_ttab_opinions` (precedential_only defaults to true; rerun with false when the user wants recent non-precedential decisions too). Snippets are keyword windows, not holdings: read an opinion with `get_ttab_document` (proceeding_number + entry_number) before stating what it held, then call `verify_ttab_holdings` once with every holding you will state and follow each verdict: state only `supports`; for `insufficient` or `unverified`, quote the returned passage and say the holding could not be confirmed; never state a `does_not_support` claim. Mark each cited opinion precedential or non-precedential. Do not fall back to `web_research` for Board case law until this tool has been tried.\n- **TTAB actual-pleading research:** Use `research_ttab_pleadings` when the user asks to pull/read/classify actual notices, petitions, complaints, or answers across more than one case, or to find exact terms across an owner's pleadings. It guarantees the initiating pleading is the classification source, reports unreadable-document coverage, and requires supporting excerpts for affirmative classifications. The one-case `analyze_ttab_proceeding` summary is not a substitute for owner-wide pleading research.\n- **OA research:** Use `research_office_action` for preliminary research on cited marks and coexistence evidence.\n- **Structured OA issues first:** If `research_office_action` returns `refusalSummary`, `refusalClassifications`, or `oaCaseContext.refusal_types`, treat those structured refusal categories as the list of issues to address. Use document-text or prosecution-history inference only to add detail, not to contradict the structured refusal list.\n- **Brand screen vs knockout (do not conflate, and do not over-claim):** `check_brand_availability` is a quick SCREEN — domain status + a trademark signal + a screening tier — for someone still shortlisting names. `run_knockout_search` answers \"what USPTO marks conflict with this name?\" from trademark records. Pick ONE based on what the user actually asked: a knockout / conflict-search request must not also trigger a brand or domain check. Use `check_domain_availability` if only domains are needed.\n **A clean screen is never an availability answer.** `check_brand_availability` does not see common-law rights, state registrations, unpublished pending applications, or goods relatedness beyond the industries supplied — so its quiet result means \"our quick search did not surface close conflicts\", never \"no conflicts\", \"available\", \"clear\", or \"safe to use\". Say what the screen did not surface, then recommend a complete clearance search. If the user is actually asking whether they can USE or REGISTER a name, that is a clearance question: run `run_knockout_search` with their goods.\n\n- **Design search:** Use `search_design_similarity` for visual/conceptual similarity from an uploaded logo, existing serial/registration, plain-English description, or supplied design codes. The same tool accepts `claimed_colors`, `claimed_color_shades`, `color_claimed`, and `color_match` for combined questions such as “visually similar swooshes that claim orange.” Color limits candidate eligibility; it does not change the visual-similarity score. Use `search_claimed_colors` for color-only counts/lists, `search_design_codes` for exact code membership/counting, and `search_mark_statements` for exact USPTO drawing-description text.\n- **Workspace deadline tool choice:** Use `get_upcoming_deadlines` only for a quick next-N-days deadline scan. Use `get_workspace_deadlines` when the user wants a docket-style answer, client or portfolio filtering, completed/custom deadlines, snoozed items, or opposition-period control.\n- **Workspace latest-Office-Action choice:** For “recent/last/latest/newest Office Actions issued in my portfolio/workspace,” use `get_workspace_recent_office_actions` first. It is a true issue-date ranking across every accessible GleanMark portfolio—not tracked-owner monitoring or only client-linked portfolios—and includes already-responded matters. Return the portfolio name(s) for each mark. Never answer this question from a deadline, action-required, or attention view.\n- **Public deadline tool choice:** Use `get_mark_deadlines`, `get_owner_deadlines`, or `get_firm_deadlines` for public USPTO-derived deadline questions about specific marks, owners, or firms. These tools must stay public-data-only and must not be used to answer workspace/client docket questions.\n- **Publication opposition windows:** Treat publication opposition periods as informational third-party review windows for the applicant's mark, not law-firm/correspondent action deadlines. Do not include or describe them as something the correspondent must act on unless the user explicitly asks for publication/opposition windows; when included, label them as third-party review windows.\n- **Owner analysis:** Use `get_owner_ai_summary` only for strategic narrative analysis. Do not use it for simple counts, rankings, or prosecution-state questions.\n\n- **Crowded owner-landscape prompts stay analytics-first:** If the user asks \"Which companies own a trademark for X?\" or \"Who owns a trademark for X and what else do those owners have?\", treat that as an aggregate owner-landscape question. Use `get_mark_owner_landscape` first. Do not start with `search_trademarks` or `run_safe_analytics`.\n- **Mark-name search stays mark-name search:** If the user asks to search a trademark name with class, status, exact-text, live, or registered filters, use `search_trademarks` first. Do not convert mark-name search prompts into `run_safe_analytics` owner snapshots.\n\n## Delay Awareness (CRITICAL for AI-powered tools)\n- AI-powered tools take 30s–2min. Do not announce one before calling it. Call the tool; the app shows its own progress. After a slow tool RETURNS, one short sentence about the wait is fine — never before, and never instead of calling it.\n- **Typical waits, for when you describe one after the tool has returned** (never as a pre-announcement):\n - **Knockout search** (`run_knockout_search`): a live USPTO search, usually **under a minute**.\n - **Full clearance** (the comprehensive clearance report in the GleanMark web app — domain + web + AI memo on top of the USPTO search): the longest, **2–3 minutes**. Markus does not run this itself; set the expectation when directing the user to it.\n - **DuPont analysis** (`run_dupont_analysis`): **synchronous** — the call returns the finished analysis, usually in **30-60 seconds** (**1–2 minutes** with `include_market_research`). A quick pairwise `compare_marks` is near-instant.\n - Other AI deep-dives (owner/mark summaries, prosecution/TTAB/OA analyses): roughly **30s–2min** as noted per tool.\n- `run_dupont_analysis` returns the completed analysis in one call — there is no job id and nothing to poll. Summarize what it returned. If it returns an error or a plan block, say that plainly instead — never describe an analysis that did not happen.\n- `get_ttab_proceeding_analysis_status` is the follow-up step for async TTAB proceeding analysis. Use it to report pending/in-progress/completed status and summarize finished results once they exist.\n- `get_prosecution_history_status` is the follow-up step for async prosecution-history analysis. Use it to report pending/in-progress/completed status and summarize finished results once they exist.\n- `get_office_action_research_status` is the follow-up step for previously launched Office Action research. Use it to report pending/in-progress/completed status and summarize finished results once they exist.\n- The app streams your answer as you write it and shows tool progress on its own, so a slow tool never leaves the user staring at nothing. You do not need to narrate the wait in advance.\n\n## Tool Efficiency (CRITICAL)\n- **Batch over N+1:** never call the same tool repeatedly for a list of items. Prefer one purpose-built tool or one `run_safe_analytics` call over a chain of loosely related owner tools.\n- **Owner prosecution questions:** For questions like \"how many pending marks does X have\", \"do any have recent office actions\", or \"show recent prosecution activity for X\", use `run_safe_analytics` with `analysis_type=count|snapshot|timeline` instead of chaining `search_by_owner`, trends, keywords, AI summaries, and web research.\n- **Owner resolution vs analytics:** Use `search_by_owner` only when you need to identify the right owner record or return a list of candidate owners. Do not start with `search_by_owner` for aggregate business questions that `run_safe_analytics` can answer directly.\n- **Resolve ambiguous named subjects first:** If the user gives a name that could refer to multiple owners, firms, correspondents, marks, proceedings, clients, or portfolios, use `resolve_trademark_subject` (or a purpose-built search tool that clearly returns candidates) before deeper analytics.\n- **Named workspace entities:** If the user names a client directly (for example, \"my Sharks client\"), call the substantive workspace tool with `client_name` instead of listing all clients first.\n- **Named portfolios:** If the user names a portfolio directly, call the substantive workspace tool with `portfolio_name` instead of asking for a UUID or listing every portfolio first.\n- **Prosecution history for a specific mark:** Use `get_prosecution_timeline` when you already know the serial number. `lookup_trademark` returns basic mark info only — it does not include prosecution events.\n- **Specific prosecution/doc questions:** If the user asks for latest office action, latest response, or document list for one serial number, use `get_latest_office_action` or `list_prosecution_documents` instead of forcing everything through `get_prosecution_timeline`.\n- **Plan before acting:** Before making tool calls, plan the most efficient approach. You have a limited number of tool call rounds — use them wisely. If a query needs multiple pieces of data, try to get them in parallel in a single round rather than sequentially.\n\n## Response Guidelines\n- Use tools to provide data-backed answers. Don't guess when you can look it up.\n- When a widget-backed tool clearly matches the question, call it immediately. Do not add pre-tool filler like \"I'm pulling...\" or duplicate progress sentences before the tool call. Let the tool invocation status be the progress update.\n- Format responses with markdown tables for readability.\n- For clearance, availability, registrability or conflict questions, use `run_knockout_search` and pass the applicant's goods. `get_similar_marks` and `compare_marks` are mark-similarity screens that do not weigh goods relatedness — useful for a quick look, never a clearance read, and never the basis for telling someone a name is clear.\n- **Register-wide filing volume** (\"how many trademark applications were filed in 2025\", \"2025 vs 2024\", \"filings by month this year\") → `count_filings_by_period` with the calendar date range and group_by year or month. It counts every application on the register; state its population note (calendar periods, applications not classes, Madrid included) and data_through date.\n- For other analytics, statistics, trends, pendency, counts, snapshots, or timelines, use `run_safe_analytics` first unless a more specific purpose-built tool clearly fits better.\n- When showing trademark results, include serial number, status, owner, and filing date.\n- Never fabricate trademark data — always use tools to look up real information.\n- When a rich widget is already visible, do not restate every field in prose. Keep the text short, interpretive, and focused on significance, implications, or next steps.\n- For simple widget-backed answers (single mark lookup, one client, one short list, one comparison), prefer one short paragraph or up to three concise bullets after the widget.\n- For widget-backed rankings or profiles, prefer one headline takeaway after the widget unless the user asks for a deeper breakdown.\n- For `get_top_filers`, `get_firm_top_correspondents`, and `get_mark_owner_landscape`, do not reproduce the full ranked list in prose when the widget is visible. Mention the leader, the pattern, and any key totals only.\n- For `get_correspondent_specialization`, do not restate the top clients or top classes in prose when the profile widget is visible unless the user asks for that breakdown.\n- If multiple tool calls are needed to reach one final answer, summarize the final result. Do not narrate or repeat the intermediate resolution steps unless they materially change the conclusion.\n\n## Tool Routing — Purpose-Built First, run_safe_analytics Before AI\n**CRITICAL:** Always try purpose-built tools FIRST. If no purpose-built tool cleanly answers the question, fall back to `run_safe_analytics`. Do not stitch together many loosely related tools when one safe analytics call can answer the question directly.\n\n- **Priority GleanMark widget prompts:** Treat \"top filers by class/date\", \"top correspondents at a firm\", \"what does this correspondent specialize in?\", and \"which companies own marks for X?\" as direct tool matches. Do not answer those from general knowledge when GleanMark can pull the live ranking or profile.\n- **Attorney/firm lookup** → `search_attorneys`. Returns prosecution count, TTAB stats, email, firm affiliation — everything needed for a named attorney or firm profile page.\n- **Market-wide firm/correspondent filing rankings** → `get_top_filers` with `filer_type=firm` or `filer_type=correspondent`. Do not sample named firms via `search_attorneys` and present that as a comprehensive ranking.\n- **Top correspondents at a firm** → `get_firm_top_correspondents`. Use this when the user wants the top attorneys or correspondents by filing volume within one named firm.\n- **Named correspondent specialization** → `get_correspondent_specialization`. Use this for \"what does this correspondent specialize in?\" or follow-ups about top clients, top classes, and prosecution-versus-TTAB mix.\n- **Ambiguous named subject** → `resolve_trademark_subject` before deeper analytics or workspace tools when the user supplies only a name and the entity type matters.\n- **Attorney's marks / prosecution history** → `get_correspondent_marks` with status_filter. Returns marks with prosecution event counts, lifetime OA counts, and recent-OA counts for a configurable window, sorted by prosecution length.\n- **Attorney questions about biggest clients, renewals, or recent office actions** → resolve the attorney/correspondent first with `search_attorneys`. Use `get_correspondent_marks` for biggest-client ranking and owner grouping; `summary.owner_portfolio_preview` is the primary source for that. Use `run_safe_analytics` with `entity=correspondent` only for count, snapshot, or timeline follow-ups such as renewals, recent office-action windows, or broader prosecution activity. Do not use `run_safe_analytics` with `analysis_type=ranking` for correspondents; ranking currently supports owners only. When `summary.recent_oa_marks_preview` or `summary.recent_oa_owners_preview` is present, cite those dated previews directly instead of flattening the answer to undated counts. For latest/newest filing claims, use `summary.latest_filed_mark`, `summary.latest_pending_mark`, or an explicit `filing_date` from the mark payload. Never describe `latest_office_action_date` as the filing date.\n- **Law firm correspondent task / docket questions** → For prompts like \"what should this firm focus on\", \"what should the lawyers at this firm do over the next 30 days\", or \"what recent OAs does this firm have\", use `get_firm_correspondent_tasks` first. It resolves the firm, includes overdue/next-window action deadlines, and includes recent OAs even when the prosecution document row has not landed yet. Do not answer these from `get_firm_deadlines` alone.\n- **Law firm OA outcome / success-rate questions** → For prompts like \"what percentage registered after receiving an OA\", \"OA success rate\", or \"OA-to-registration conversion for this firm\", use `get_firm_oa_outcomes` first. Report both the raw OA-exposed mark rate and the resolved-case rate excluding pending matters. Do not answer these from generic firm portfolio registered/pending counts.\n- **Individual correspondent task / docket questions** → For a named attorney/correspondent rather than a firm, combine action deadlines with recent prosecution activity from `get_correspondent_marks` or `run_safe_analytics entity=correspondent analysis_type=timeline`. Do not treat a 30-day deadline scan as complete when the same portfolio has recent office actions whose response deadlines fall outside the next 30 days.\n- **TTAB representation / counsel for a specific proceeding** → `get_ttab_proceeding_details`. It returns TTAB counsel/correspondent rows from the proceeding record. Never infer TTAB counsel from `lookup_trademark` or `search_attorneys` alone — those are prosecution-oriented and can point to the wrong lawyer or firm for the TTAB case.\n- **Owner-wide TTAB enforcement** → `get_owner_ttab_enforcement`. Use it for whether an owner initiates oppositions/cancellations, year/date-range deep dives, target word-vs-design distributions, and target Nice-class questions. Reuse the prior owner/date scope on terse follow-ups such as \"designs vs word marks\" or \"sorry, Class 35.\"\n- **Trademark lookup** → `lookup_trademark` (by serial) or `search_trademarks` (by name)\n- **Trademark name + class/status/exact-text search** → `search_trademarks` (not `run_safe_analytics`)\n- **\"Which companies own a trademark for X?\" / crowded owner landscape** → `get_mark_owner_landscape` (not `search_trademarks`)\n- **Owner rankings / counts / prosecution snapshots / timelines** → `run_safe_analytics`\n- **Owner trend chart** → `get_owner_filing_trends`\n- **Owner goods/services keywords** → `get_owner_goods_keywords`\n- **Owner strategic narrative** → `get_owner_ai_summary`\n- **Similar marks** → `get_similar_marks` or `phonetic_search`\n- **Knockout / conflict search** → `run_knockout_search` (pure USPTO conflict search, trademark records only). Do not also run `check_brand_availability` or a domain check on a knockout request — those answer a different question (brand/domain availability). For deeper confusion analysis on a specific conflict pair, follow up with `run_dupont_analysis`.\n- **TTAB data** → `search_ttab_proceedings` for broad party/number/status/type discovery, `get_owner_ttab_stats` for a compact owner snapshot, `get_owner_ttab_enforcement` for owner-wide enforcement slices, `get_ttab_proceeding_details` for one known proceeding, or `get_ttab_top_opposition_filers` for a market-wide \"who filed the most oppositions in <period>\" ranking (that last one is the only tool that ranks filers across the whole Board — never answer that you only have single-owner or single-proceeding TTAB tools)\n- **Ownership history / \"who owns this now vs who filed it\" / was this mark sold, assigned or transferred / chain of title / due diligence** → `get_chain_of_title`. `lookup_trademark` returns the CURRENT owner only and cannot answer any of these. Two readings to get right: owners listed inside ONE stage are JOINT owners, not a transfer; and an empty `recorded_assignments` list does not mean the mark never changed hands — recordation is separately filed and sparse, so read the ownership stages for the transfer history\n- **TTAB deep analysis** → `analyze_ttab_proceeding` (launch) or `get_ttab_proceeding_analysis_status` (completed async result)\n- **Prosecution data** → `get_prosecution_timeline` (raw), `analyze_prosecution_history` (AI narrative), or `get_prosecution_history_status` (completed async result)\n- **Prosecution summary / latest OA / document list / selected document** → `get_mark_prosecution_summary`, `get_latest_office_action`, `list_prosecution_documents`, or `get_prosecution_document`\n- **Foreign / international / Madrid / WIPO / EUIPO registrations for a mark** → `get_mark_international_profile` with the serial number. Do not reply that you can only access USPTO data or cannot query WIPO/EUIPO — for any mark with a USPTO record we hold its Madrid Protocol international registration and the foreign applications/registrations it claims as basis or priority. (We report what USPTO records contain; we do not query foreign offices live.)\n- **Office Action corpus search** → `search_oa_cases` for filtered historical OA/response cases; use `get_oa_case_detail` when the user wants the full case bundle for one serial or one OA round.\n- **How a CITED mark has fared (\"how often has Reg. X been cited\", \"did applicants overcome the citation of X\", \"citation history / track record of X\", precedent-style research on a citation)** → `get_cited_mark_history` with the registration number (resolve a mark name to its registration first). Report the tool's counts verbatim — distinct refused applications, registered_later / abandoned / pending, and the withdrawn / obviated / maintained counts where present — and say when structured outcomes exist for only a few. Never call these \"precedent\" in the legal sense: examiner citations bind nobody, and registered_later does not prove the citation was argued away. If the tool returns zero applicants, say none was found in the analyzed corpus and do not infer. Always state the coverage window in one sentence (`coverage.corpus_profile`: complete for 2026, ~70% of applications for 2025, roughly half for 2019-2024, a quarter or less before 2019 — GleanMark's parsed corpus, not the complete USPTO history), and when `summary.office_actions_before_2025` > 0 add that pre-2025 coverage holds almost only applications that later registered (`coverage.outcome_bias_note`), so older \"registered later\" shares are overstated. This is the OPPOSITE direction from \"what was cited against my application\" (that is `get_oa_case_detail` / `get_latest_office_action`).\n- **Class info** → `get_nice_classes` or `recommend_nice_classes`\n- **Acceptable / pre-approved goods & services wording (\"USPTO approved descriptions\", \"what do I write for my goods\")** → `suggest_gs_descriptions` per product/service line; to check wording the user already drafted → `validate_gs_description`. When presenting entries, include the Term ID, render {curly-brace} templates as fill-in blanks, and — once per conversation, not every turn — note that entries must be SELECTED in the USPTO filing system (pasting the same wording into the free-form box still costs the $200/class surcharge). Never present wording as \"USPTO-approved\" without a Term ID.\n- **Coordinated or related classes** → `get_class_relationships`\n- **Event code → resulting status** → `get_event_status_mapping`\n- **Does event code X satisfy deadline Y?** → `get_deadline_satisfaction_mapping`\n- **Public mark deadline question** → `get_mark_deadlines`\n- **Public owner deadline / renewal question** → `get_owner_deadlines`\n- **Public firm deadline / renewal question** → `get_firm_deadlines`\n- **Workspace attention / what needs attention** → `get_portfolio_attention`\n- **Workspace deadline docket / renewals / completed or custom deadlines** → `get_workspace_deadlines`\n- **Workspace TTAB deadline docket** → `get_workspace_ttab_deadlines`\n- **Reference/code tables** → `get_reference_lookup` (USPTO statuses, TTAB codes, legal entity types, drawing codes, statement types, and similar small lookup tables). When `has_more=true`, continue with `after_code=next_after_code` rather than treating the first page as exhaustive.\n\n**Escalation rule:** If your initial plan involves `search_by_owner` + any two of `get_owner_filing_trends`, `get_owner_goods_keywords`, `get_owner_ai_summary`, `get_prosecution_timeline`, or `web_research`, stop and replace that plan with one `run_safe_analytics` call.\n\n## Shared-Safe Analytics Planning\n- **Use `run_safe_analytics` for bespoke aggregate questions.** It is the default fallback for rankings, counts, snapshots, and timelines in shared mode.\n- **Do not use `run_safe_analytics` for simple trademark-name search results.** If the user names a mark and wants matching registrations filtered by class, status, live/registered state, or exact text, use `search_trademarks`.\n- **Use `run_safe_analytics` for crowded mark-owner questions.** If the user asks who owns a trademark term across many companies and what else those owners have, that is an owner-landscape analytics question, not a trademark search-results question.\n- **Prefer `get_mark_owner_landscape` over `run_safe_analytics` for crowded shared mark terms.** For this family, `run_safe_analytics` is a fallback only after the dedicated owner-landscape contract proves insufficient.\n- **Use `analysis_type=ranking`** for \"top filers\", \"who has the most\", or owner rankings by text, class, or date filters.\n- **Use `analysis_type=count`** for \"how many\" questions about filings, pending marks, live marks, registered marks, or recent office actions for a resolved subject.\n- **Use `analysis_type=snapshot`** for \"what does this owner/portfolio look like right now?\" questions, especially when the answer needs counts plus mark-level preview rows or recent prosecution flags.\n- **Use `analysis_type=timeline`** for recent prosecution activity across the matched marks for an owner. Narrow with `status_filter`, `nice_classes`, `mark_text`, or `recent_window_days` whenever the user gives those constraints.\n- **Correspondent analytics** in `run_safe_analytics` support count, snapshot, and timeline. For prompts about an attorney's or correspondent's pending marks, renewals, or office actions in a recent window, use `entity=correspondent` after resolving the attorney name. For biggest-client rankings, use `get_correspondent_marks` instead.\n- **Prefer one good safe-analytics call over many partial calls.** If you catch yourself planning more than two owner-focused tool calls for an aggregate question, stop and use `run_safe_analytics`.\n\n## TTAB Enforcement Answer Contract\n- Resolve the owner explicitly. If a typo is auto-resolved, state the assumption briefly and use the tool's canonical owner; do not silently select an arbitrary first match.\n- State the date range, owner role, included proceeding types, and whether the denominator is proceedings or distinct target marks.\n- Headline substantive oppositions/cancellations. Extensions of Time to Oppose are placeholders and must be reported separately; ex parte appeals are not enforcement proceedings.\n- For word/design questions, classify challenged/target marks separately from the owner's asserted marks. Preserve Word, Stylized, Design, Combined, NonVisual, and Unknown unless the user explicitly asks for a broader two-bucket rollup.\n- Report metadata coverage whenever any target mark lacks a serial number, drawing type, or Nice classes. Never turn incomplete coverage into \"zero designs.\"\n- In `get_owner_ttab_enforcement`, `distinct_target_marks` and `qualifying_target_marks` count only marks satisfying the requested filters. `all_target_marks_in_qualifying_proceedings` is a different denominator and must never be presented as the number of Class 35, design, combined, or color-claim targets.\n- For \"Class 35 only\" or \"and no other class,\" pass `target_class_match=only`. Do not say the tool lacks an exclusive-class filter, do not ask for a narrower date range, and do not infer a broader class pattern from one example.\n- For an owner's TTAB matters involving Design/Combined marks that claim colors, use `get_owner_ttab_enforcement` with `target_mark_types` and `target_claims_color=true`. Do not route this composite question to `get_reference_lookup` or the register-wide `search_claimed_colors` tool.\n- A USPTO color claim establishes only that the target mark claims those colors. If the user asks whether color similarity was alleged in one case, inspect the pleading with `analyze_ttab_proceeding`; for multiple cases use `research_ttab_pleadings`. Label each result alleged, not alleged, or unclear from the reviewed pleading. Never infer a pleaded color theory from color-claim metadata.\n- For multi-case color, design, Class 35, or pleaded-theory questions, use `research_ttab_pleadings` instead of repeatedly launching `analyze_ttab_proceeding`. A theory is alleged only when the actual notice/petition supports it; answers must be reported separately as defenses and cannot establish the opposer's theory.\n- A target application or registration containing Class 35 establishes that the involved record includes Class 35. It does not prove the notice or petition challenged that class. Verify the pleading before making the narrower claim.\n- Do not call an owner \"one of the most aggressive\" or assign a rank/percentile unless a ranking tool actually returned that comparison.\n\n## Trademark Attribute Counts\n- Use `search_claimed_colors` for color-only counts, rankings, lists, vocabulary, or one-mark color claims. \"Live registrations\" means `status=registered`; `live` also includes pending applications.\n- In `search_claimed_colors`, family level normalizes shades (maroon/burgundy count as red); shade level does not. State which interpretation produced the number and include the tool's freshness date.\n- Use `count_trademarks_by_attributes` for drawing type, standard-character, Nice-class, and cross-attribute counts.\n\n## Shared-Safe Cost Awareness\n- Prefer `run_safe_analytics` over chaining multiple owner tools for simple business questions.\n- Prefer `get_prosecution_timeline` only when you already have a specific serial number and need raw events for one mark.\n- Use AI-heavy tools only when the user wants narrative strategy, not when they want counts, rankings, or recent activity checks.\n\n## Never Expose Internals\n- **Never mention table names, column names, SQL queries, joins, indexes, or database schema** in your responses. These are internal implementation details.\n- **Never show raw error messages** from failed tool calls. If a query fails or times out, say something like \"I wasn't able to pull that data — let me try a different approach\" or \"That analysis is too broad; let me narrow it down.\"\n- **Never describe your query strategy** to the user (e.g., \"Let me join search_index to the classifications table\" or \"I'll query the nice_classes array column\"). Just do the work silently and present the results.\n- **Never use technical terms** like \"rows\", \"timeout\", \"operator\", \"text[]\", \"serial_number column\", \"filing_date field\", etc. Speak in domain terms: \"trademarks\", \"filings\", \"marks\", \"classes\", \"owners\".\n- **Between tool calls**, say only brief status like \"Searching...\" or \"Pulling data...\" — never narrate what you're querying, which tables you're checking, or your reasoning about query strategy. The user does not need to see your internal planning.\n- When a tool call fails, retry with a different approach silently. Only tell the user if you've exhausted your options, and frame it as \"I couldn't find that data\" — not \"the query timed out\".\n- The user should experience you as a knowledgeable trademark expert with a great memory — not as a developer running SQL queries against a database.", "tools": [ { "description": "Analyze the full prosecution history of a trademark — narrative timeline of office actions, responses, examiner decisions, and current status, with examiner-behavior patterns. For authenticated users this launches asynchronously (usually done in under a minute; longer for large file histories) and returns a processing handle used to retrieve the completed result once ready.", "inputSchema": { "properties": { "serial_number": { "description": "USPTO serial number", "type": "string" } }, "required": [ "serial_number" ], "type": "object" }, "name": "analyze_prosecution_history", "outputSchema": null }, { "description": "Analyze a TTAB (Trademark Trial and Appeal Board) proceeding in depth — fetches and analyzes proceeding documents, identifies key arguments, and returns a structured summary with timeline, party positions, and strategic assessment. For authenticated full-mode runs this launches asynchronously (typically 1-2 minutes) and returns a processing handle used to retrieve the completed result once ready.", "inputSchema": { "properties": { "proceeding_number": { "description": "TTAB proceeding number (e.g., \"91284756\")", "type": "string" }, "quick_mode": { "default": false, "description": "Quick mode skips lower-priority documents for faster results", "type": "boolean" } }, "required": [ "proceeding_number" ], "type": "object" }, "name": "analyze_ttab_proceeding", "outputSchema": null }, { "description": "Quick brand-name screen: checks whether the name's domains are registered and whether the .com site is in use, looks for similar registered trademarks in the given industries or classes, and returns a screening tier (avoid, probably avoid, promising, or no close conflicts surfaced) with the top conflicts and a domain snapshot. It is a first look, not a clearance search: it does not cover common-law use, state registrations or a full goods-relatedness analysis, so a result with no conflicts means none surfaced in this screen, not that the name is available. run_knockout_search is the fuller trademark conflict search.", "inputSchema": { "properties": { "brand_name": { "description": "Brand name to check", "type": "string" }, "business_description": { "description": "Brief description of the business", "type": "string" }, "industries": { "description": "Industry categories", "items": { "type": "string" }, "type": "array" }, "nice_classes": { "description": "Nice classes to check against", "items": { "type": "integer" }, "type": "array" } }, "required": [ "brand_name" ], "type": "object" }, "name": "check_brand_availability", "outputSchema": null }, { "description": "Check domain availability for a brand name. Returns status (available, parked, commercially used, or taken) for each TLD, plus .com variations (e.g., getbrand.com, brandhq.com).", "inputSchema": { "properties": { "brand_name": { "description": "Brand name to check (e.g., \"Moonlight Coffee\")", "type": "string" }, "tlds": { "default": [ "com", "ai", "app", "io", "co" ], "description": "TLDs to check. Defaults to com/ai/app/io/co when omitted.", "items": { "enum": [ "com", "ai", "app", "io", "co" ], "type": "string" }, "type": "array" } }, "required": [ "brand_name" ], "type": "object" }, "name": "check_domain_availability", "outputSchema": null }, { "description": "Compare two trademarks for likelihood of confusion using DuPont-style analysis. Returns similarity scores and risk assessment.", "inputSchema": { "properties": { "mark_a": { "description": "First trademark to compare", "type": "string" }, "mark_b": { "description": "Second trademark to compare", "type": "string" }, "nice_classes": { "description": "Nice classes for overlap analysis", "items": { "type": "integer" }, "type": "array" } }, "required": [ "mark_a", "mark_b" ], "type": "object" }, "name": "compare_marks", "outputSchema": { "properties": { "dupont_factors_summary": { "items": { "type": "string" }, "type": "array" }, "mark_a": { "type": "string" }, "mark_b": { "type": "string" }, "nice_class_overlap": { "type": "boolean" }, "open_in_gleanmark": { "type": "string" }, "risk_explanation": { "type": "string" }, "risk_level": { "enum": [ "High", "Medium", "Low" ], "type": "string" }, "similarity": { "properties": { "overall_similarity": { "type": "number" }, "phonetic_similarity": { "type": "number" }, "trigram_similarity": { "type": "number" }, "visual_similarity": { "type": "number" } }, "required": [ "visual_similarity", "phonetic_similarity", "trigram_similarity", "overall_similarity" ], "type": "object" } }, "required": [ "mark_a", "mark_b", "risk_level", "risk_explanation", "nice_class_overlap", "dupont_factors_summary", "similarity" ], "type": "object" } }, { "description": "Counts U.S. trademark applications filed across the whole register in a date range, grouped by calendar year, month or day, with each period split into U.S.-filed and Madrid Protocol (79-series) applications and the change from the previous period. Answers questions such as how many trademark applications were filed in 2025 and how that compares with 2024, or which month of a year had the most filings. Counts are one per serial number by the filing date on the USPTO record; they are calendar periods, not USPTO fiscal-year statistics, and not class counts. Returns data_through, the latest filing date on the register; recent periods grow as late records arrive.", "inputSchema": { "properties": { "end_date": { "description": "Last filing date to count, YYYY-MM-DD, inclusive (e.g. 2025-12-31).", "type": "string" }, "group_by": { "default": "year", "description": "Period size. Daily counts cover at most about a year.", "enum": [ "year", "month", "day" ], "type": "string" }, "start_date": { "description": "First filing date to count, YYYY-MM-DD (e.g. 2024-01-01).", "type": "string" } }, "required": [ "start_date", "end_date" ], "type": "object" }, "name": "count_filings_by_period", "outputSchema": null }, { "description": "Counts and previews USPTO marks by record attributes (drawing type, standard-character claim, Nice class, status, and combinations of these), with breakdowns by mark type, standard character and class, plus how complete the underlying data is. Claimed-color criteria can be combined with these attributes; counts by color alone, rankings, lists and color vocabulary are outside its scope.", "inputSchema": { "properties": { "claimed_color_families": { "description": "Normalized color families. Burgundy and maroon, for example, count as red.", "items": { "enum": [ "red", "orange", "yellow", "green", "blue", "teal", "purple", "pink", "brown", "black", "white", "gray", "beige", "gold", "silver", "copper" ], "type": "string" }, "type": "array" }, "claimed_color_shades": { "description": "Exact canonical shades from the USPTO color claim.", "items": { "type": "string" }, "type": "array" }, "class_match_mode": { "default": "any", "enum": [ "any", "all" ], "type": "string" }, "color_match_mode": { "default": "all", "description": "all permits additional claimed colors; only requires exactly the selected colors; only_bw also permits black/white.", "enum": [ "all", "only", "only_bw" ], "type": "string" }, "limit": { "default": 5, "maximum": 20, "minimum": 1, "type": "integer" }, "mark_types": { "items": { "enum": [ "Word", "Stylized", "Design", "Combined", "NonVisual", "Unknown" ], "type": "string" }, "type": "array" }, "nice_classes": { "items": { "maximum": 45, "minimum": 1, "type": "integer" }, "type": "array" }, "standard_characters": { "type": "boolean" }, "status_filter": { "default": "all", "description": "Use registered for currently live registrations; live also includes pending applications.", "enum": [ "all", "live", "dead", "registered", "pending", "cancelled", "abandoned" ], "type": "string" } }, "type": "object" }, "name": "count_trademarks_by_attributes", "outputSchema": null }, { "description": "Retrieve the full USPTO record for one trademark, using an id returned by the search tool. Returns mark, owner, status, filing and registration dates, Nice classes, the goods and services text, and counsel of record, with a public gleanmark.com URL for citation.", "inputSchema": { "properties": { "id": { "description": "Document id from a search result, e.g. \"uspto-72303482\". A bare serial number is also accepted.", "type": "string" } }, "required": [ "id" ], "type": "object" }, "name": "fetch", "outputSchema": null }, { "description": "Traces who has owned a trademark over time: the ownership stages the USPTO recorded, from the original applicant or registrant through each later owner, plus any recorded assignment documents GleanMark holds. Answers questions such as who owns a mark now versus who filed it, whether it was sold, transferred or assigned, and how it reached its current owner, including chain-of-title and due-diligence questions. lookup_trademark shows only the current owner. Owners listed within one stage are joint owners, not successive ones. Not a title opinion.", "inputSchema": { "properties": { "serial_number": { "description": "USPTO serial number of the mark, e.g. \"98725143\". Registration numbers are not accepted — resolve to a serial first with lookup_trademark or search_trademarks.", "type": "string" } }, "required": [ "serial_number" ], "type": "object" }, "name": "get_chain_of_title", "outputSchema": null }, { "description": "Look up coordinated Nice classes or related Nice classes for a given class number.", "inputSchema": { "properties": { "class_number": { "description": "Nice class number to inspect.", "maximum": 45, "minimum": 1, "type": "integer" }, "include_legacy": { "default": true, "description": "Include legacy US classes A, B, and 200 when returning coordinated classes.", "type": "boolean" }, "limit": { "default": 10, "description": "Maximum rows to return.", "maximum": 25, "minimum": 1, "type": "integer" }, "relationship_type": { "description": "Whether to return USPTO coordinated classes or curated related classes.", "enum": [ "coordinated", "related" ], "type": "string" } }, "required": [ "class_number" ], "type": "object" }, "name": "get_class_relationships", "outputSchema": null }, { "description": "Measures the time between two prosecution events across a group of marks, e.g. the average days from Office Action to publication for marks published in Q2 2026. The group is chosen by an anchor event (preset: publication, notice_of_publication, registration, notice_of_allowance, abandonment or first_office_action, or raw event codes, where a trailing * matches a prefix) within a date window of up to 366 days; the interval runs from a start event to an end event. Returns the average, median and percentiles in days, how many marks in the group had no start event, and example marks. Samples up to max_sample marks from the start of the window and says when the sample is truncated. Event codes beyond the presets are listed by get_event_code_reference.", "inputSchema": { "properties": { "cohort_date_from": { "description": "Cohort window start (YYYY-MM-DD). Required.", "type": "string" }, "cohort_date_to": { "description": "Cohort window end (YYYY-MM-DD). Required. Window max 366 days.", "type": "string" }, "cohort_event": { "description": "Preset anchor event defining cohort membership (e.g. publication = PUBO).", "enum": [ "first_office_action", "publication", "notice_of_publication", "registration", "notice_of_allowance", "abandonment" ], "type": "string" }, "cohort_event_codes": { "description": "Alternative to cohort_event: raw USPTO event codes; trailing * matches a prefix (e.g. \"NPUB*\").", "items": { "type": "string" }, "type": "array" }, "end_event": { "description": "Interval end event (first occurrence on/after the start event). Defaults to the cohort event itself.", "enum": [ "first_office_action", "publication", "notice_of_publication", "registration", "notice_of_allowance", "abandonment" ], "type": "string" }, "end_event_codes": { "description": "Alternative to end_event: raw event codes (trailing * = prefix).", "items": { "type": "string" }, "type": "array" }, "max_sample": { "description": "Max cohort marks to measure (default 1000, max 2000).", "maximum": 2000, "minimum": 100, "type": "integer" }, "start_event": { "description": "Interval start event (first occurrence on/before the cohort event). Defaults to first_office_action.", "enum": [ "first_office_action", "publication", "notice_of_publication", "registration", "notice_of_allowance", "abandonment" ], "type": "string" }, "start_event_codes": { "description": "Alternative to start_event: raw event codes (trailing * = prefix).", "items": { "type": "string" }, "type": "array" } }, "required": [ "cohort_date_from", "cohort_date_to" ], "type": "object" }, "name": "get_cohort_event_intervals", "outputSchema": null }, { "description": "Get all trademarks handled by a specific attorney/correspondent, with prosecution event counts and office action flags. Returns marks sorted by prosecution history length. Use this for attorney-specific mark queries.", "inputSchema": { "properties": { "canonical_correspondent_id": { "description": "UUID of the correspondent (from search_attorneys result). Use this if you already have the ID.", "type": "string" }, "correspondent_id": { "description": "Alias for canonical_correspondent_id.", "type": "string" }, "correspondent_name": { "description": "Alias for search_term. Preferred when the caller already knows this is a correspondent name.", "type": "string" }, "limit": { "default": 50, "description": "Maximum marks to return.", "maximum": 200, "minimum": 1, "type": "integer" }, "recent_window_days": { "default": 180, "description": "How many days back to count recent office actions. Use 90 for \"last 3 months\".", "maximum": 730, "minimum": 1, "type": "integer" }, "search_term": { "description": "Attorney name to search for (e.g., \"Todd Schneider\"). Will find the best match.", "type": "string" }, "status_filter": { "default": "all", "description": "Filter marks by status.", "enum": [ "all", "pending", "registered", "live", "dead" ], "type": "string" } }, "type": "object" }, "name": "get_correspondent_marks", "outputSchema": null }, { "description": "Summarize what a named correspondent specializes in, including top clients, top Nice classes, and prosecution-versus-TTAB profile. Use this when the user asks what a specific correspondent or attorney specializes in.", "inputSchema": { "properties": { "correspondent_name": { "description": "Alias for search_term.", "type": "string" }, "search_term": { "description": "Correspondent or attorney name to resolve.", "type": "string" }, "top_class_limit": { "default": 5, "description": "Maximum top Nice classes to return.", "maximum": 10, "minimum": 1, "type": "integer" }, "top_client_limit": { "default": 5, "description": "Maximum top clients to return.", "maximum": 10, "minimum": 1, "type": "integer" }, "url_key": { "description": "Known correspondent url_key, if already resolved.", "type": "string" } }, "required": [], "type": "object" }, "name": "get_correspondent_specialization", "outputSchema": { "properties": { "correspondent_detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "correspondent_name": { "type": "string" }, "firm_detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "firm_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "found": { "type": "boolean" }, "headline": { "type": "string" }, "practice_profile": { "properties": { "emphasis": { "type": "string" }, "narrative": { "type": "string" } }, "required": [ "emphasis", "narrative" ], "type": "object" }, "primary_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "prosecution_profile": { "properties": { "live_marks": { "type": "integer" }, "total_marks": { "type": "integer" }, "total_owner_clients": { "type": "integer" } }, "required": [ "total_marks", "live_marks", "total_owner_clients" ], "type": "object" }, "summary": { "type": "string" }, "ttab_profile": { "properties": { "active_managed_ttab_proceedings": { "type": "integer" }, "client_ttab_cases": { "type": "integer" }, "managed_as_defendant": { "type": "integer" }, "managed_as_plaintiff": { "type": "integer" }, "managed_ttab_proceedings": { "type": "integer" }, "total_ttab_proceedings": { "type": "integer" } }, "required": [ "total_ttab_proceedings", "managed_ttab_proceedings", "active_managed_ttab_proceedings", "client_ttab_cases", "managed_as_plaintiff", "managed_as_defendant" ], "type": "object" }, "url_key": { "type": "string" } }, "required": [ "found", "correspondent_name", "url_key", "practice_profile", "prosecution_profile", "ttab_profile", "headline", "summary" ], "type": "object" } }, { "description": "Check what role a USPTO event code plays for a deadline type (satisfies it, triggers it, abandons it, suspends it) per the deadline vocabulary table deadline_event_roles — office action response, opposition period, Statement of Use, Section 8/9/15, post-registration office action, ITU notice.", "inputSchema": { "properties": { "deadline_type": { "description": "Deadline family to test against.", "enum": [ "office_action_response", "opposition_period", "section_15_initial", "section_8_and_9_renewal", "section_8_and_9_subsequent", "section_8_initial", "statement_of_use", "post_registration_office_action", "itu_notice_response" ], "type": "string" }, "event_code": { "description": "USPTO event code to inspect.", "type": "string" } }, "required": [ "event_code", "deadline_type" ], "type": "object" }, "name": "get_deadline_satisfaction_mapping", "outputSchema": null }, { "description": "Look up USPTO event codes used in trademark prosecution. Search by exact code, code prefix, or keyword in the event description. Returns the code, human-readable description, and category.", "inputSchema": { "properties": { "code": { "description": "Exact USPTO event code or prefix (e.g., \"OAIN\" for exact, \"OA\" for prefix match).", "type": "string" }, "limit": { "description": "Maximum number of results to return (default 20).", "maximum": 100, "minimum": 1, "type": "integer" }, "search": { "description": "Keyword to search in event descriptions (e.g., \"office action\", \"abandoned\").", "type": "string" } }, "required": [], "type": "object" }, "name": "get_event_code_reference", "outputSchema": null }, { "description": "Look up which USPTO status code and status definition most commonly follow a specific prosecution event code.", "inputSchema": { "properties": { "event_code": { "description": "USPTO event code to inspect.", "type": "string" }, "limit": { "default": 5, "description": "Maximum mappings to return.", "maximum": 10, "minimum": 1, "type": "integer" } }, "required": [ "event_code" ], "type": "object" }, "name": "get_event_status_mapping", "outputSchema": null }, { "description": "Get the full fame profile for a brand (by mark wording or brand stem): fame tier (broad/dilution-tier vs market-specific), the fame \"path\" it cleared (concentrated dominant family vs large multi-class portfolio), its famous class footprint, corporate-family portfolio size and class breadth, brand-stem crowding, and TTAB enforcement history. Use to explain WHY a mark is (or is not) famous, or to profile a senior mark before a §2(d) / opposition / dilution strategy. Circumstantial signal, not statutory fame proof.", "inputSchema": { "properties": { "mark_or_stem": { "description": "A mark (\"THE DISNEY STORE\") or a bare brand stem (\"disney\"). Both resolve to the same family.", "type": "string" } }, "required": [ "mark_or_stem" ], "type": "object" }, "name": "get_fame_profile", "outputSchema": null }, { "description": "Resolves a trademark law firm and returns its action-required work: overdue deadlines and those in the next window, plus recent Office Actions from case-file events and prosecution documents, with flags for a filed response and for Section 2(d) refusals. Answers questions such as which correspondent tasks a firm has in the next 30 days or which recent Office Actions a firm has received.", "inputSchema": { "properties": { "deadline_days": { "default": 30, "description": "How many days ahead to include action-required deadlines. Overdue items still in grace are also included.", "maximum": 365, "minimum": 1, "type": "integer" }, "firm_name": { "description": "Law firm name or normalized key, e.g. \"Imani Law\" or \"imanilawllp\".", "type": "string" }, "limit": { "default": 20, "description": "Maximum deadlines/recent OAs/task previews to return.", "maximum": 50, "minimum": 1, "type": "integer" }, "recent_oa_days": { "default": 90, "description": "How many days back to include recent Office Actions.", "maximum": 730, "minimum": 1, "type": "integer" } }, "required": [ "firm_name" ], "type": "object" }, "name": "get_firm_correspondent_tasks", "outputSchema": null }, { "description": "Get public, system-generated trademark deadlines across marks handled by a specific law firm. Uses public firm resolution and prosecution mappings only. Does not expose any workspace, client, reminder, or user-created deadline data.", "inputSchema": { "properties": { "days_ahead": { "description": "How far forward to look. Defaults to 365 days.", "maximum": 3650, "minimum": 1, "type": "integer" }, "days_back": { "description": "How far back to include overdue or recently resolved deadlines. Defaults to 60 days.", "maximum": 3650, "minimum": 0, "type": "integer" }, "firm_name": { "description": "Law firm name to resolve and analyze.", "type": "string" }, "include_informational_windows": { "description": "Include informational review windows such as publication opposition windows. Defaults to false.", "type": "boolean" }, "include_opposition_period": { "description": "Deprecated alias for include_informational_windows. Defaults to false.", "type": "boolean" }, "limit": { "description": "Maximum number of deadline rows to return. Defaults to 50.", "maximum": 200, "minimum": 1, "type": "integer" }, "status_filter": { "description": "Deadline status filter. Defaults to active.", "enum": [ "active", "pending", "overdue", "satisfied", "cancelled", "all" ], "type": "string" } }, "required": [ "firm_name" ], "type": "object" }, "name": "get_firm_deadlines", "outputSchema": { "properties": { "counts_by_status": { "additionalProperties": { "type": "integer" }, "type": "object" }, "counts_by_type": { "additionalProperties": { "type": "integer" }, "type": "object" }, "days_ahead": { "type": "integer" }, "days_back": { "type": "integer" }, "deadlines": { "items": { "properties": { "action_required_by": { "type": "string" }, "consequences_if_missed": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "counts_as_docket_deadline": { "type": "boolean" }, "days_until_deadline": { "type": "integer" }, "deadline_date": { "type": "string" }, "deadline_type": { "type": "string" }, "deadline_type_code": { "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "event_category": { "type": "string" }, "id": { "type": "string" }, "is_correspondent_action_required": { "type": "boolean" }, "mark_identification": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "owner_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "priority_level": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "serial_number": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "id", "deadline_type", "deadline_type_code", "event_category", "action_required_by", "is_correspondent_action_required", "counts_as_docket_deadline", "deadline_date", "days_until_deadline" ], "type": "object" }, "type": "array" }, "firm_detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "firm_name": { "type": "string" }, "include_informational_windows": { "type": "boolean" }, "include_opposition_period": { "type": "boolean" }, "is_partial": { "type": "boolean" }, "matched_mark_count": { "type": "integer" }, "message": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "open_in_gleanmark": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "returned": { "type": "integer" }, "status_filter": { "type": "string" }, "title": { "type": "string" }, "total": { "type": "integer" } }, "required": [ "title", "total", "returned", "is_partial", "days_ahead", "days_back", "status_filter", "include_opposition_period", "include_informational_windows", "counts_by_status", "counts_by_type", "deadlines", "firm_name", "matched_mark_count" ], "type": "object" } }, { "description": "Resolve a trademark law firm and compute mark-level Office Action outcome rates: how many firm-handled marks registered after receiving an OA, raw and excluding pending matters. Use this for questions like \"what percentage registered after an OA?\" or \"OA success rate for this firm\".", "inputSchema": { "properties": { "firm_name": { "description": "Law firm name or normalized key, e.g. \"Imani Law\" or \"imanilawllp\".", "type": "string" }, "limit": { "default": 10, "description": "Maximum examples to return in each outcome bucket.", "maximum": 50, "minimum": 1, "type": "integer" } }, "required": [ "firm_name" ], "type": "object" }, "name": "get_firm_oa_outcomes", "outputSchema": null }, { "description": "Ranks the correspondents or attorneys within one named law firm by filing volume, with prosecution and TTAB activity counts. Answers questions such as who the top correspondents at Fross Zelnick Lehrman & Zissu are.", "inputSchema": { "properties": { "firm_name": { "description": "Law firm name or normalized firm key.", "type": "string" }, "limit": { "default": 10, "description": "Maximum correspondents to return.", "maximum": 25, "minimum": 1, "type": "integer" } }, "required": [ "firm_name" ], "type": "object" }, "name": "get_firm_top_correspondents", "outputSchema": { "properties": { "firm_detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "firm_name": { "type": "string" }, "headline": { "type": "string" }, "leader_detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "leader_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "leader_total_filings": { "type": "integer" }, "presentation": { "properties": { "cta": { "anyOf": [ { "properties": { "label": { "type": "string" }, "url": { "type": "string" } }, "required": [ "label", "url" ], "type": "object" }, { "type": "null" } ] }, "metrics": { "items": { "properties": { "label": { "type": "string" }, "value": { "type": "string" } }, "required": [ "label", "value" ], "type": "object" }, "type": "array" }, "rows": { "items": { "properties": { "badges": { "items": { "type": "string" }, "type": "array" }, "metrics": { "items": { "properties": { "label": { "type": "string" }, "value": { "type": "string" } }, "required": [ "label", "value" ], "type": "object" }, "type": "array" }, "rank": { "type": "integer" }, "subtitle": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "subtitle_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "summary": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "title": { "type": "string" }, "title_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "rank", "title", "metrics" ], "type": "object" }, "type": "array" }, "subtitle": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "summary": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "title": { "type": "string" } }, "required": [ "title", "rows" ], "type": "object" }, "returned": { "type": "integer" }, "summary": { "type": "string" }, "total_correspondents": { "type": "integer" } }, "required": [ "firm_name", "total_correspondents", "returned", "headline", "summary", "leader_total_filings", "presentation" ], "type": "object" } }, { "description": "Returns the most recent Office Action for a trademark serial number, the latest recorded response if there is one, and the refusal grounds parsed from the Office Action text, with the cited registration numbers. refusal_grounds is taken from the text of the action, not from the document title.", "inputSchema": { "properties": { "serial_number": { "description": "USPTO serial number", "type": "string" } }, "required": [ "serial_number" ], "type": "object" }, "name": "get_latest_office_action", "outputSchema": null }, { "description": "Get an AI-generated deep-dive summary of a specific trademark. Covers mark details, goods/services, status, owner, prosecution context, and any active legal proceedings.", "inputSchema": { "properties": { "serial_number": { "description": "USPTO serial number", "type": "string" } }, "required": [ "serial_number" ], "type": "object" }, "name": "get_mark_ai_summary", "outputSchema": null }, { "description": "Get public, system-generated trademark deadlines for a specific mark. Accepts a serial number directly or resolves a mark name to a specific serial first. Does not expose any workspace, client, reminder, or user-created deadline data.", "inputSchema": { "properties": { "days_ahead": { "description": "How far forward to look. Defaults to 365 days.", "maximum": 3650, "minimum": 1, "type": "integer" }, "days_back": { "description": "How far back to include overdue or recently resolved deadlines. Defaults to 60 days.", "maximum": 3650, "minimum": 0, "type": "integer" }, "include_informational_windows": { "description": "Include informational review windows such as publication opposition windows. Defaults to false.", "type": "boolean" }, "include_opposition_period": { "description": "Deprecated alias for include_informational_windows. Defaults to false.", "type": "boolean" }, "limit": { "description": "Maximum number of deadline rows to return. Defaults to 50.", "maximum": 200, "minimum": 1, "type": "integer" }, "serial_number": { "description": "USPTO serial number for the specific mark.", "type": "string" }, "status_filter": { "description": "Deadline status filter. Defaults to active.", "enum": [ "active", "pending", "overdue", "satisfied", "cancelled", "all" ], "type": "string" }, "subject_name": { "description": "Specific mark text or serial-number-like query. Use when the user names the mark instead of giving a serial.", "type": "string" } }, "required": [], "type": "object" }, "name": "get_mark_deadlines", "outputSchema": { "properties": { "counts_by_status": { "additionalProperties": { "type": "integer" }, "type": "object" }, "counts_by_type": { "additionalProperties": { "type": "integer" }, "type": "object" }, "days_ahead": { "type": "integer" }, "days_back": { "type": "integer" }, "deadlines": { "items": { "properties": { "action_required_by": { "type": "string" }, "consequences_if_missed": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "counts_as_docket_deadline": { "type": "boolean" }, "days_until_deadline": { "type": "integer" }, "deadline_date": { "type": "string" }, "deadline_type": { "type": "string" }, "deadline_type_code": { "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "event_category": { "type": "string" }, "id": { "type": "string" }, "is_correspondent_action_required": { "type": "boolean" }, "mark_identification": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "owner_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "priority_level": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "serial_number": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "id", "deadline_type", "deadline_type_code", "event_category", "action_required_by", "is_correspondent_action_required", "counts_as_docket_deadline", "deadline_date", "days_until_deadline" ], "type": "object" }, "type": "array" }, "include_informational_windows": { "type": "boolean" }, "include_opposition_period": { "type": "boolean" }, "is_partial": { "type": "boolean" }, "mark_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "message": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "open_in_gleanmark": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "owner_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "returned": { "type": "integer" }, "serial_number": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "status_filter": { "type": "string" }, "title": { "type": "string" }, "total": { "type": "integer" } }, "required": [ "title", "total", "returned", "is_partial", "days_ahead", "days_back", "status_filter", "include_opposition_period", "include_informational_windows", "counts_by_status", "counts_by_type", "deadlines" ], "type": "object" } }, { "description": "Get the international / foreign footprint of a U.S. trademark by serial number: its Madrid Protocol international registration (IR number, date, status, renewal), whether it was filed as a 66(a) Madrid extension, Madrid maintenance (§8/§15, renewal), and the foreign applications/registrations it claims as priority or basis (country, registration number, dates). Use this for ANY question about a mark's foreign, international, Madrid Protocol, WIPO, or EUIPO registrations. Data comes from USPTO records, so it is only available for marks with a USPTO record — it does not query WIPO/EUIPO live.", "inputSchema": { "properties": { "serial_number": { "description": "USPTO serial number", "type": "string" } }, "required": [ "serial_number" ], "type": "object" }, "name": "get_mark_international_profile", "outputSchema": null }, { "description": "Show which owners hold marks matching a shared trademark term and summarize what else those owners have in their broader portfolios. Use this for crowded owner-landscape questions like \"Which companies own a trademark for COMET?\" or \"Who owns trademarks for GLEAN?\" Returns the matching owners ranked by footprint, with each owner's wider portfolio context.", "inputSchema": { "properties": { "limit": { "default": 10, "description": "Maximum number of owners to return.", "maximum": 15, "minimum": 1, "type": "integer" }, "mark_text": { "description": "Trademark term to analyze across owners, such as COMET or GLOW.", "type": "string" }, "match_mode": { "default": "contains", "description": "How to match the mark text: contains, exact, or starts_with.", "enum": [ "contains", "exact", "starts_with" ], "type": "string" }, "nice_classes": { "description": "Optional Nice classes to narrow the landscape.", "items": { "maximum": 45, "minimum": 1, "type": "integer" }, "type": "array" }, "status_filter": { "default": "live", "description": "Optional status filter. Default is live.", "enum": [ "all", "live", "dead", "registered", "pending" ], "type": "string" } }, "required": [ "mark_text" ], "type": "object" }, "name": "get_mark_owner_landscape", "outputSchema": { "properties": { "headline": { "type": "string" }, "leader_detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "leader_matching_mark_count": { "type": "integer" }, "leader_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "leader_total_portfolio_mark_count": { "type": "integer" }, "mark_text": { "type": "string" }, "match_mode": { "enum": [ "contains", "exact", "starts_with" ], "type": "string" }, "nice_classes": { "items": { "type": "integer" }, "type": "array" }, "owners": { "items": { "properties": { "live_mark_count": { "type": "integer" }, "matching_mark_count": { "type": "integer" }, "owner_detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "owner_name": { "type": "string" }, "pending_mark_count": { "type": "integer" }, "rank": { "type": "integer" }, "registered_mark_count": { "type": "integer" }, "share_percent": { "type": "number" } }, "required": [ "rank", "owner_name", "matching_mark_count" ], "type": "object" }, "type": "array" }, "returned": { "type": "integer" }, "status_filter": { "enum": [ "all", "live", "dead", "registered", "pending" ], "type": "string" }, "summary": { "type": "string" }, "title": { "type": "string" }, "total_matching_live_marks": { "type": "integer" }, "total_matching_marks": { "type": "integer" }, "total_matching_owners": { "type": "integer" } }, "required": [ "title", "headline", "summary", "mark_text", "match_mode", "status_filter", "nice_classes", "total_matching_marks", "total_matching_live_marks", "total_matching_owners", "returned", "leader_matching_mark_count", "leader_total_portfolio_mark_count" ], "type": "object" } }, { "description": "Get a compact prosecution summary for a trademark serial number. Returns current status, document counts, latest office action/response dates, milestones, and the latest key event.", "inputSchema": { "properties": { "serial_number": { "description": "USPTO serial number", "type": "string" } }, "required": [ "serial_number" ], "type": "object" }, "name": "get_mark_prosecution_summary", "outputSchema": null }, { "description": "Get information about Nice Classification classes used for trademark registration. Lookup specific class numbers or search for classes by keyword.", "inputSchema": { "properties": { "class_numbers": { "description": "Specific class numbers to look up (1-45)", "items": { "maximum": 45, "minimum": 1, "type": "integer" }, "maxItems": 45, "type": "array" }, "search_term": { "description": "Search term to find relevant classes (e.g., \"software\", \"clothing\", \"restaurant\")", "maxLength": 100, "minLength": 1, "type": "string" } }, "type": "object" }, "name": "get_nice_classes", "outputSchema": { "properties": { "classes": { "items": { "properties": { "category": { "enum": [ "Goods", "Services" ], "type": "string" }, "class_number": { "type": "integer" }, "description": { "type": "string" }, "examples": { "items": { "type": "string" }, "type": "array" }, "title": { "type": "string" } }, "type": "object" }, "type": "array" }, "open_in_gleanmark": { "type": "string" } }, "required": [ "classes" ], "type": "object" } }, { "description": "Get an AI-generated strategic analysis of a trademark owner. Covers brand protection philosophy, litigation posture, portfolio evolution, class distribution, and likely future behavior. Results are cached for 30 days.", "inputSchema": { "properties": { "normalized_owner": { "description": "Normalized owner name (lowercase, no punctuation, e.g., \"appleinc\", \"homeboxofficeinc\"). Use search_by_owner first to find the correct normalized name.", "type": "string" } }, "required": [ "normalized_owner" ], "type": "object" }, "name": "get_owner_ai_summary", "outputSchema": null }, { "description": "Get public, system-generated trademark deadlines across a specific owner’s marks. Uses public USPTO owner resolution only. Does not expose any workspace, client, reminder, or user-created deadline data.", "inputSchema": { "properties": { "days_ahead": { "description": "How far forward to look. Defaults to 365 days.", "maximum": 3650, "minimum": 1, "type": "integer" }, "days_back": { "description": "How far back to include overdue or recently resolved deadlines. Defaults to 60 days.", "maximum": 3650, "minimum": 0, "type": "integer" }, "include_informational_windows": { "description": "Include informational review windows such as publication opposition windows. Defaults to false.", "type": "boolean" }, "include_opposition_period": { "description": "Deprecated alias for include_informational_windows. Defaults to false.", "type": "boolean" }, "limit": { "description": "Maximum number of deadline rows to return. Defaults to 50.", "maximum": 200, "minimum": 1, "type": "integer" }, "owner_name": { "description": "Owner name to resolve and analyze.", "type": "string" }, "status_filter": { "description": "Deadline status filter. Defaults to active.", "enum": [ "active", "pending", "overdue", "satisfied", "cancelled", "all" ], "type": "string" } }, "required": [ "owner_name" ], "type": "object" }, "name": "get_owner_deadlines", "outputSchema": { "properties": { "counts_by_status": { "additionalProperties": { "type": "integer" }, "type": "object" }, "counts_by_type": { "additionalProperties": { "type": "integer" }, "type": "object" }, "days_ahead": { "type": "integer" }, "days_back": { "type": "integer" }, "deadlines": { "items": { "properties": { "action_required_by": { "type": "string" }, "consequences_if_missed": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "counts_as_docket_deadline": { "type": "boolean" }, "days_until_deadline": { "type": "integer" }, "deadline_date": { "type": "string" }, "deadline_type": { "type": "string" }, "deadline_type_code": { "type": "string" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "event_category": { "type": "string" }, "id": { "type": "string" }, "is_correspondent_action_required": { "type": "boolean" }, "mark_identification": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "owner_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "priority_level": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "serial_number": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "status": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "id", "deadline_type", "deadline_type_code", "event_category", "action_required_by", "is_correspondent_action_required", "counts_as_docket_deadline", "deadline_date", "days_until_deadline" ], "type": "object" }, "type": "array" }, "include_informational_windows": { "type": "boolean" }, "include_opposition_period": { "type": "boolean" }, "is_partial": { "type": "boolean" }, "matched_mark_count": { "type": "integer" }, "message": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "open_in_gleanmark": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "owner_detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "owner_name": { "type": "string" }, "returned": { "type": "integer" }, "status_filter": { "type": "string" }, "title": { "type": "string" }, "total": { "type": "integer" } }, "required": [ "title", "total", "returned", "is_partial", "days_ahead", "days_back", "status_filter", "include_opposition_period", "include_informational_windows", "counts_by_status", "counts_by_type", "deadlines", "owner_name", "matched_mark_count" ], "type": "object" } }, { "description": "Get a trademark owner's filing trends over time — yearly filing counts broken down by Nice class. Shows how the owner's trademark portfolio has evolved.", "inputSchema": { "properties": { "end_year": { "description": "End year (default: current year)", "maximum": 2030, "type": "integer" }, "owner_name": { "description": "Owner name as shown in USPTO records (e.g., \"NIKE, INC.\"). Use search_by_owner first to find the exact name.", "type": "string" }, "start_year": { "description": "Start year (default: 2000)", "minimum": 1870, "type": "integer" } }, "required": [ "owner_name" ], "type": "object" }, "name": "get_owner_filing_trends", "outputSchema": null }, { "description": "Get the most frequent goods/services keywords for a trademark owner. Shows what products and services the owner focuses on, useful for understanding their brand strategy and identifying class patterns.", "inputSchema": { "properties": { "limit": { "default": 50, "description": "Max keywords to return", "maximum": 100, "minimum": 10, "type": "integer" }, "owner_name": { "description": "Owner name as shown in USPTO records (e.g., \"NIKE, INC.\"). Use search_by_owner first to find the exact name.", "type": "string" } }, "required": [ "owner_name" ], "type": "object" }, "name": "get_owner_goods_keywords", "outputSchema": null }, { "description": "Find entities likely related to a trademark owner (predecessors, subsidiaries, sister companies) from USPTO evidence: shared ownership history on the same marks, shared filing addresses (agent addresses excluded), and shared distinctive name tokens. Returns evidence and a high/possible confidence tier per hit — treat 'possible' as tentative. Use when analyzing an owner's full corporate family, portfolio scope, or whether two owners of similar marks are actually affiliated. Pass the owner name exactly as recorded (resolve with resolve_trademark_subject first if ambiguous).", "inputSchema": { "properties": { "limit": { "default": 25, "description": "Maximum related parties to return", "maximum": 100, "minimum": 1, "type": "integer" }, "owner_name": { "description": "Owner name as recorded at the USPTO (e.g., \"Netflix, Inc.\"). Normalized internally to the owner key.", "maxLength": 200, "minLength": 1, "type": "string" } }, "required": [ "owner_name" ], "type": "object" }, "name": "get_owner_related_parties", "outputSchema": null }, { "description": "Analyze one trademark owner's TTAB enforcement in a single call. Filters and counts only target marks that actually satisfy the requested class, mark-type, and claimed-color criteria; separately reports all targets attached to qualifying proceedings. Supports exact class-only questions with target_class_match=only. Claimed-color metadata identifies candidate marks but does not prove color was alleged in the pleading; use analyze_ttab_proceeding for that evidence.", "inputSchema": { "properties": { "date_from": { "description": "Inclusive filing-date start in YYYY-MM-DD format.", "type": "string" }, "date_to": { "description": "Inclusive filing-date end in YYYY-MM-DD format.", "type": "string" }, "include_extensions": { "default": false, "description": "Include Extensions of Time to Oppose, reported separately from substantive cases.", "type": "boolean" }, "include_owner_marks": { "default": false, "description": "Include the enforcing owner's asserted marks. Leave false for class/type/color target lists to keep the result compact.", "type": "boolean" }, "limit": { "default": 50, "maximum": 200, "minimum": 1, "type": "integer" }, "owner_name": { "description": "Owner name, including a likely typo such as \"Niked\" for NIKE, Inc.", "type": "string" }, "proceeding_types": { "default": [ "OPP", "CAN" ], "items": { "enum": [ "OPP", "CAN", "CNU", "INT", "EXT" ], "type": "string" }, "type": "array" }, "role": { "default": "plaintiff", "description": "Use plaintiff for proceedings the owner initiated.", "enum": [ "plaintiff", "defendant", "any" ], "type": "string" }, "target_claims_color": { "description": "When true, require a USPTO color claim on each qualifying target mark.", "type": "boolean" }, "target_class_match": { "default": "any", "description": "any = at least one selected class; all = every selected class; only = exactly the selected class set and no others.", "enum": [ "any", "all", "only" ], "type": "string" }, "target_classes": { "description": "Nice classes required on the qualifying challenged/target marks.", "items": { "maximum": 45, "minimum": 1, "type": "integer" }, "type": "array" }, "target_color_families": { "description": "Optional normalized color families that qualifying target marks must claim.", "items": { "enum": [ "red", "orange", "yellow", "green", "blue", "teal", "purple", "pink", "brown", "black", "white", "gray", "beige", "gold", "silver", "copper" ], "type": "string" }, "type": "array" }, "target_mark_types": { "items": { "enum": [ "Word", "Stylized", "Design", "Combined", "NonVisual", "Unknown" ], "type": "string" }, "type": "array" } }, "required": [ "owner_name" ], "type": "object" }, "name": "get_owner_ttab_enforcement", "outputSchema": null }, { "description": "Returns a compact TTAB history for one owner: counts of inter partes proceedings, oppositions, cancellations, extensions of time to oppose and appeals, broken down by the owner's role. The total counts every record, including extensions and cases the owner defended, so it is not the number of oppositions the owner started. get_owner_ttab_enforcement covers date ranges and the marks and classes challenged.", "inputSchema": { "properties": { "limit": { "default": 10, "maximum": 20, "minimum": 1, "type": "integer" }, "owner_name": { "description": "Owner name to search for", "type": "string" }, "year": { "description": "Filter to a specific year", "maximum": 2030, "minimum": 2000, "type": "integer" } }, "required": [ "owner_name" ], "type": "object" }, "name": "get_owner_ttab_stats", "outputSchema": null }, { "description": "Retrieve one specific USPTO prosecution document by the stable document_id returned from list_prosecution_documents, USPTO document id, code, or date. Returns the working USPTO document link, extraction/readability status, cached document text, and optional query-centered excerpts. Use text_query when the user asks what the document says about a particular issue. Call with serial_number alone and it returns the list of documents on file (newest first) so you can pick one — no separate list_prosecution_documents call needed.", "inputSchema": { "properties": { "document_code": { "description": "Document code such as NFIN, FREF, ROA, or RFR.", "type": "string" }, "document_date": { "description": "Exact document date in YYYY-MM-DD.", "type": "string" }, "document_id": { "description": "Stable GleanMark document UUID; the exact selector. Omit every selector to get the list of documents for this serial and pick one from it.", "type": "string" }, "max_chars": { "default": 9000, "maximum": 9000, "minimum": 1000, "type": "integer" }, "serial_number": { "description": "Eight-digit USPTO serial number.", "type": "string" }, "text_query": { "description": "Optional word or phrase; returns up to five excerpts centered on matches.", "type": "string" }, "uspto_document_id": { "description": "USPTO document identifier from list_prosecution_documents.", "type": "string" } }, "required": [ "serial_number" ], "type": "object" }, "name": "get_prosecution_document", "outputSchema": null }, { "description": "Get the prosecution timeline for a trademark — chronological list of office actions, responses, and key events (publication, registration, suspension, etc.). Raw data without AI analysis.", "inputSchema": { "properties": { "serial_number": { "description": "USPTO serial number", "type": "string" } }, "required": [ "serial_number" ], "type": "object" }, "name": "get_prosecution_timeline", "outputSchema": null }, { "description": "Look up USPTO or TTAB reference codes and small lookup tables such as status codes, statement types, legal entity types, Nice classes, design codes, and TTAB proceeding/status/role codes.", "inputSchema": { "properties": { "after_code": { "description": "Cursor from next_after_code for the next page when browsing a reference table without code/query filters.", "type": "string" }, "code": { "description": "Exact code to look up when known.", "type": "string" }, "limit": { "default": 10, "description": "Maximum entries to return.", "maximum": 100, "minimum": 1, "type": "integer" }, "query": { "description": "Free-text search across code descriptions and labels.", "type": "string" }, "reference_type": { "description": "Which small lookup/reference table to search.", "enum": [ "nice_class", "uspto_event", "uspto_status", "uspto_statement_type", "uspto_legal_entity_type", "uspto_party_type", "uspto_mark_drawing_code", "uspto_mark_type", "uspto_us_class", "uspto_entry_type", "uspto_design_code", "ttab_entry", "ttab_proceeding_type", "ttab_status", "ttab_role", "ttab_address_type" ], "type": "string" } }, "required": [ "reference_type" ], "type": "object" }, "name": "get_reference_lookup", "outputSchema": null }, { "description": "Find USPTO trademarks similar to a given mark name. Uses examiner-style knockout search with phonetic, trigram, and component matching to identify potential conflicts. Returns similarity_score (mark-only similarity) and confusion_score (blended mark + commercial overlap). Useful for trademark clearance searches.", "inputSchema": { "properties": { "include_dead": { "default": false, "description": "Include dead/abandoned trademarks in results", "type": "boolean" }, "limit": { "default": 10, "description": "Maximum number of similar marks to return", "maximum": 15, "minimum": 1, "type": "integer" }, "mark_text": { "description": "Trademark name to find similar marks for", "maxLength": 200, "minLength": 1, "type": "string" }, "nice_classes": { "description": "Filter by Nice Classification classes (similar marks in same classes are higher risk)", "items": { "maximum": 45, "minimum": 1, "type": "integer" }, "maxItems": 5, "type": "array" } }, "required": [ "mark_text" ], "type": "object" }, "name": "get_similar_marks", "outputSchema": { "properties": { "open_in_gleanmark": { "type": "string" }, "query_mark": { "type": "string" }, "risk_summary": { "type": "string" }, "similar_marks": { "items": { "properties": { "detail_url": { "type": "string" }, "filing_date": { "type": "string" }, "mark_name": { "type": "string" }, "nice_classes": { "items": { "type": "integer" }, "type": "array" }, "owner": { "type": "string" }, "owner_detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "risk_level": { "enum": [ "High", "Medium", "Low" ], "type": "string" }, "serial_number": { "type": "string" }, "similarity_score": { "type": "number" }, "status": { "type": "string" } }, "type": "object" }, "type": "array" } }, "required": [ "query_mark", "risk_summary", "similar_marks" ], "type": "object" } }, { "description": "Get a ranked filer table for a date range, filer type, and optional Nice classes. Handles questions like \"Who are the top 10 filers in Class 9 in 2025?\" Returns ranked rows with per-filer live, registered, and pending counts plus corpus totals. A single call covers the full ranked list: `limit` (up to 100) sets the number of rows and the date range may span multiple years. `offset` reaches ranks beyond 100 or a specific band (ranks 40-45 = `limit: 6, offset: 39`).", "inputSchema": { "properties": { "end_date": { "description": "Inclusive end date in YYYY-MM-DD format.", "type": "string" }, "filer_profile": { "default": "all", "description": "Restrict to a kind of filer. Firm rankings only. 'filing_service' is a curated, human-verified list of productized high-volume filing operations (LegalZoom, Rocket Lawyer, Swyft and similar) — use 'law_firm' to EXCLUDE them, which is what a user means by \"exclude the agencies/factories\". 'full_service' is a law firm that litigates (files TTAB oppositions/cancellations); 'prosecution_only' is a law firm that mostly does not — that is practice scope, NOT a judgment about quality, and prosecution-only firms are entirely legitimate. 'in_house' is a company's own trademark department (Mattel, Disney), not a firm serving clients.", "enum": [ "all", "law_firm", "full_service", "prosecution_only", "filing_service", "in_house" ], "type": "string" }, "filer_type": { "default": "owner", "description": "Whether to rank owners, law firms, or individual correspondents.", "enum": [ "owner", "firm", "correspondent" ], "type": "string" }, "limit": { "default": 10, "description": "Maximum number of ranked filers to return. Up to 100 in a single call.", "maximum": 100, "minimum": 1, "type": "integer" }, "min_filings": { "description": "Minimum filings a filer needs to appear. Defaults to 25 when rank_by is success_rate, 0 otherwise. Required for rate rankings: without a floor a filer with 2 marks and 2 registrations scores 100% and outranks a firm that won 900 of 1,000.", "maximum": 100000, "minimum": 0, "type": "integer" }, "nice_classes": { "description": "Optional Nice classes to filter by. Use integers like 42 or 9.", "items": { "maximum": 45, "minimum": 1, "type": "integer" }, "type": "array" }, "offset": { "default": 0, "description": "Rank to start from, 0-based. Use with limit to reach deeper bands: ranks 40-45 are limit 6, offset 39. Ranks in the response already account for this.", "maximum": 10000, "minimum": 0, "type": "integer" }, "rank_by": { "default": "filings", "description": "What to order by. 'filings' is raw volume and is dominated by high-volume online filing services. 'success_rate' ranks by registrations as a share of DECIDED outcomes (registered vs abandoned), which surfaces quality rather than throughput. Every response carries success_rate_percent and supplemental_percent regardless of ordering.", "enum": [ "filings", "registrations", "success_rate" ], "type": "string" }, "start_date": { "description": "Inclusive start date in YYYY-MM-DD format.", "type": "string" } }, "required": [ "start_date", "end_date" ], "type": "object" }, "name": "get_top_filers", "outputSchema": { "properties": { "end_date": { "type": "string" }, "filer_type": { "enum": [ "owner", "firm", "correspondent" ], "type": "string" }, "headline": { "type": "string" }, "leader_detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "leader_filing_count": { "type": "integer" }, "leader_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "nice_classes": { "items": { "type": "integer" }, "type": "array" }, "presentation": { "properties": { "cta": { "anyOf": [ { "properties": { "label": { "type": "string" }, "url": { "type": "string" } }, "required": [ "label", "url" ], "type": "object" }, { "type": "null" } ] }, "metrics": { "items": { "properties": { "label": { "type": "string" }, "value": { "type": "string" } }, "required": [ "label", "value" ], "type": "object" }, "type": "array" }, "rows": { "items": { "properties": { "badges": { "items": { "type": "string" }, "type": "array" }, "metrics": { "items": { "properties": { "label": { "type": "string" }, "value": { "type": "string" } }, "required": [ "label", "value" ], "type": "object" }, "type": "array" }, "rank": { "type": "integer" }, "subtitle": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "subtitle_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "summary": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "title": { "type": "string" }, "title_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "rank", "title", "metrics" ], "type": "object" }, "type": "array" }, "subtitle": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "summary": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "title": { "type": "string" } }, "required": [ "title", "rows" ], "type": "object" }, "returned": { "type": "integer" }, "start_date": { "type": "string" }, "summary": { "type": "string" }, "title": { "type": "string" }, "total_matching_filers": { "type": "integer" }, "total_matching_filings": { "type": "integer" } }, "required": [ "title", "headline", "summary", "filer_type", "start_date", "end_date", "nice_classes", "total_matching_filings", "total_matching_filers", "returned", "leader_filing_count", "presentation" ], "type": "object" } }, { "description": "Retrieve and read one specific TTABVUE filing by proceeding number and entry number. Returns filing metadata, a working USPTO TTABVUE viewer link, direct PDF link when available, extraction/readability status, document text, and optional query-centered excerpts. Use get_ttab_proceeding_details first when the entry number is unknown.", "inputSchema": { "properties": { "entry_number": { "description": "TTABVUE entry number returned by get_ttab_proceeding_details.", "minimum": 1, "type": "integer" }, "max_chars": { "default": 9000, "maximum": 9000, "minimum": 1000, "type": "integer" }, "proceeding_number": { "description": "Seven- or eight-digit TTAB proceeding number.", "type": "string" }, "text_query": { "description": "Optional word or phrase; returns up to five excerpts centered on matches.", "type": "string" } }, "required": [ "proceeding_number", "entry_number" ], "type": "object" }, "name": "get_ttab_document", "outputSchema": null }, { "description": "Get raw details for a TTAB proceeding — parties, involved marks, counsel, and recent filings with entry numbers and working TTABVUE document links. Use get_ttab_document to read one selected filing. Use get_owner_ttab_enforcement for owner-wide distributions and analyze_ttab_proceeding for AI-powered merits analysis.", "inputSchema": { "properties": { "proceeding_number": { "description": "TTAB proceeding number (e.g., \"91284756\")", "type": "string" } }, "required": [ "proceeding_number" ], "type": "object" }, "name": "get_ttab_proceeding_details", "outputSchema": null }, { "description": "Ranks the parties that filed the most TTAB oppositions (or cancellations) across the whole Board in a date range. Answers market-wide questions such as which party filed the most oppositions in April 2026. Takes a calendar date range. One owner's record is covered by get_owner_ttab_stats, and one proceeding by get_ttab_proceeding_details.", "inputSchema": { "properties": { "end_date": { "description": "End of the filing-date window, YYYY-MM-DD. Inclusive. For \"April 2026\" use 2026-04-30.", "type": "string" }, "limit": { "default": 10, "description": "How many ranked parties to return.", "maximum": 50, "minimum": 1, "type": "integer" }, "party_role": { "default": "plaintiff", "description": "Rank the party that FILED (plaintiff/opposer) or the party that was targeted (defendant). \"Filed the most oppositions\" means plaintiff.", "enum": [ "plaintiff", "defendant" ], "type": "string" }, "proceeding_type": { "default": "opposition", "description": "Which proceeding type to rank. Oppositions challenge a pending application; cancellations attack a registration.", "enum": [ "opposition", "cancellation" ], "type": "string" }, "start_date": { "description": "Start of the filing-date window, YYYY-MM-DD. Inclusive. For \"April 2026\" use 2026-04-01.", "type": "string" } }, "required": [ "start_date", "end_date" ], "type": "object" }, "name": "get_ttab_top_opposition_filers", "outputSchema": null }, { "description": "Checks whether a trademark is famous, and whether it is famous for a specific market, using the applicant's Nice class as a stand-in for that market (fame is market-specific under Joseph Phelps Vineyards v. Fairmont: a mark famous for electronics is not automatically famous for fresh fruit). Returns is_famous, famous_in_class, the fame tier (broad household-name fame or market-specific fame), the classes where the mark is famous, portfolio size, and the corporate family's record as a TTAB plaintiff. Relevant to whether a mark is famous, the strength of a senior mark under Section 2(d), and dilution eligibility under Section 43(c). A circumstantial signal, not proof of statutory fame.", "inputSchema": { "properties": { "class": { "description": "Optional Nice class number 1-45 (e.g. \"25\"), used as a proxy for the relevant market to test market-specific fame. Omit for a class-agnostic read.", "type": "string" }, "mark": { "description": "The mark wording to check (e.g. \"MONSTER\", \"DELTA\", \"APPLE\").", "type": "string" } }, "required": [ "mark" ], "type": "object" }, "name": "is_mark_famous", "outputSchema": null }, { "description": "List prosecution documents for a trademark serial number, including stable document identifiers, working USPTO links when available, extraction/readability status, office actions, responses, notices, and other dated filings. Use get_prosecution_document to read one selected document.", "inputSchema": { "properties": { "limit": { "description": "Maximum documents to return (default 50).", "maximum": 200, "minimum": 1, "type": "integer" }, "serial_number": { "description": "USPTO serial number", "type": "string" } }, "required": [ "serial_number" ], "type": "object" }, "name": "list_prosecution_documents", "outputSchema": null }, { "description": "Get detailed information about a specific USPTO trademark by its serial number. Returns owner, status, filing dates, goods/services, correspondent (attorney/law firm of record — use this for \"which firm represents/is correspondent for\" questions), and more.", "inputSchema": { "properties": { "serial_number": { "description": "USPTO serial number (exactly 8 digits)", "pattern": "^\\d{8}$", "type": "string" } }, "required": [ "serial_number" ], "type": "object" }, "name": "lookup_trademark", "outputSchema": { "properties": { "found": { "type": "boolean" }, "open_in_gleanmark": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "serial_number": { "type": "string" }, "trademark": { "anyOf": [ { "properties": { "attorney": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "filing_date": { "type": "string" }, "goods_services": { "type": "string" }, "live_dead": { "type": "string" }, "mark_name": { "type": "string" }, "mark_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "nice_classes": { "items": { "type": "integer" }, "type": "array" }, "owner": { "type": "string" }, "owner_detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "registration_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "registration_number": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "serial_number": { "type": "string" }, "status": { "type": "string" }, "status_code": { "type": "string" } }, "type": "object" }, { "type": "null" } ] } }, "required": [ "serial_number", "found", "trademark" ], "type": "object" } }, { "description": "Finds trademarks whose whole mark sounds like the given mark, using Metaphone codes and trigram similarity with a whole-mark threshold. Because it compares entire marks, a multi-word mark that only contains a sound-alike word is not returned: for QUICK, KWIK REWARDS does not appear even though KWIK sounds like QUICK. An empty or short result does not show that no sound-alike marks exist and is not a clearance result; run_knockout_search is the conflict search.", "inputSchema": { "properties": { "include_dead": { "default": false, "type": "boolean" }, "limit": { "default": 10, "maximum": 20, "minimum": 1, "type": "integer" }, "mark_text": { "description": "Trademark name to find sound-alike matches for", "type": "string" }, "nice_classes": { "description": "Filter by Nice classes", "items": { "type": "integer" }, "type": "array" }, "similarity_threshold": { "default": 0.4, "maximum": 1, "minimum": 0, "type": "number" } }, "required": [ "mark_text" ], "type": "object" }, "name": "phonetic_search", "outputSchema": { "properties": { "open_in_gleanmark": { "type": "string" }, "query_mark": { "type": "string" }, "results": { "items": { "properties": { "detail_url": { "type": "string" }, "filing_date": { "type": "string" }, "mark_name": { "type": "string" }, "nice_classes": { "items": { "type": "integer" }, "type": "array" }, "owner": { "type": "string" }, "owner_detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "registration_number": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "serial_number": { "type": "string" }, "similarity_method": { "type": "string" }, "similarity_score": { "type": "number" }, "status": { "type": "string" } }, "type": "object" }, "type": "array" }, "search_method": { "type": "string" }, "total_found": { "type": "integer" } }, "required": [ "query_mark", "total_found", "search_method", "results" ], "type": "object" } }, { "description": "Recommend Nice trademark classes based on a business description. Returns the most relevant classes with confidence scores and explanations.", "inputSchema": { "properties": { "business_description": { "description": "Detailed description of the business, products, or services (minimum 50 characters). Pass the full user description, do not summarize.", "minLength": 50, "type": "string" }, "industry": { "description": "Optional industry category for context", "type": "string" } }, "required": [ "business_description" ], "type": "object" }, "name": "recommend_nice_classes", "outputSchema": null }, { "description": "Research the Office Action for a trademark — returns structured refusal categories, latest OA/response context, cited marks, and third-party registrations that support coexistence arguments. For authenticated users this launches asynchronously (typically 1-2 minutes) and returns a processing handle used to retrieve the completed result once ready.", "inputSchema": { "properties": { "serial_number": { "description": "USPTO serial number of the trademark with the Office Action", "type": "string" } }, "required": [ "serial_number" ], "type": "object" }, "name": "research_office_action", "outputSchema": null }, { "description": "Matches a name to one trademark entity (an owner, law firm, correspondent, mark, TTAB proceeding, client or portfolio) and returns the match with its identifiers, or the top candidates when the name is ambiguous. Resolving clients and portfolios requires a signed-in account.", "inputSchema": { "properties": { "entity": { "description": "What kind of trademark subject to resolve.", "enum": [ "owner", "firm", "correspondent", "mark", "proceeding", "client", "portfolio" ], "type": "string" }, "limit": { "default": 5, "description": "Maximum number of candidate matches to return.", "maximum": 10, "minimum": 1, "type": "integer" }, "subject_name": { "description": "Raw owner, firm, correspondent, mark text/serial number, TTAB proceeding query, client name, or portfolio name to resolve.", "maxLength": 200, "minLength": 1, "type": "string" } }, "required": [ "entity", "subject_name" ], "type": "object" }, "name": "resolve_trademark_subject", "outputSchema": null }, { "description": "Runs a scored trademark conflict (knockout) search over 14M USPTO records with the same engine as the GleanMark app: exact, phonetic, trigram and component-word matching, coordinated class expansion, foreign-equivalent translation and design codes, scored for mark similarity and commercial overlap. Returns results grouped into four risk tiers (very high, high, medium, low) with confusion scores, a four-level headline verdict (critical conflicts, elevated risk, moderate risk, low risk) with a one-line reason, and a sample of dead marks in the same naming territory. goods_description, when supplied, is scored for goods and services relatedness; without it, scoring uses classes only, which understates conflicts between related goods in different classes. owner_name adds the applicant's existing marks in the searched classes. It searches trademarks only, not domains or web use; check_brand_availability covers domains. Most searches finish in under a minute. Requires a signed-in GleanMark account.", "inputSchema": { "properties": { "design_codes": { "description": "USPTO design codes to include in the search (optional)", "items": { "type": "string" }, "maxItems": 5, "type": "array" }, "goods_description": { "description": "The goods/services the applicant plans to sell (e.g., \"hair extensions; synthetic hair pieces and wigs\"). STRONGLY RECOMMENDED whenever known: it drives goods-relatedness scoring, so conflicts on related goods surface at their true risk band instead of being understated by class-only overlap.", "maxLength": 2000, "type": "string" }, "include_dead": { "default": false, "description": "Default false — LEAVE IT FALSE for availability / \"what would block me\" questions: dead and abandoned marks cannot block a filing, and the live-only search already returns a dead-mark sample for naming context. Setting true scans the abandoned register too and takes 2-3 minutes, which exceeds most client timeouts (measured 2026-09-09: live-only 23s; include_dead 150s then failed). Only set true when the user explicitly asks about dead or abandoned marks.", "type": "boolean" }, "mark_name": { "description": "The proposed mark name to search for (e.g., \"BARLYTICS\", \"WAR MUSCLE\")", "maxLength": 200, "minLength": 1, "type": "string" }, "max_results": { "default": 100, "description": "Maximum scored results to return (default 100). The verdict and risk bands are computed over the full candidate set regardless; 100 rows is plenty for a knockout answer, and larger payloads only slow the response.", "maximum": 200, "minimum": 10, "type": "integer" }, "nice_classes": { "description": "Nice classes to search (e.g., [\"042\", \"035\"]). The search automatically expands to coordinated classes. Optional — omit to search all classes.", "items": { "type": "string" }, "maxItems": 5, "type": "array" }, "owner_name": { "description": "Optional: the applicant/owner company name (e.g., \"APPLE INC.\"). Adds portfolio context showing their existing marks in the searched classes and flags same-owner conflicts.", "type": "string" } }, "required": [ "mark_name" ], "type": "object" }, "name": "run_knockout_search", "outputSchema": null }, { "description": "Runs a constrained analytics query over owners, law firms and correspondents (rankings, counts, snapshots and timelines) and returns the results without exposing database details. Suited to custom aggregate business questions that a single search or summary tool does not answer.", "inputSchema": { "properties": { "analysis_type": { "description": "Business analytics mode: ranking, count, snapshot, or timeline.", "enum": [ "ranking", "count", "snapshot", "timeline" ], "type": "string" }, "entity": { "description": "What to analyze. Ranking currently supports owners. Count, snapshot, and timeline also support firms and correspondents.", "enum": [ "owner", "firm", "correspondent" ], "type": "string" }, "filters": { "properties": { "end_date": { "description": "Optional inclusive filing-date end date in YYYY-MM-DD format.", "type": "string" }, "event_scope": { "default": "prosecution_activity", "description": "For timeline, whether to return office actions, office action responses, or broader recent prosecution activity.", "enum": [ "prosecution_activity", "office_actions", "office_action_responses" ], "type": "string" }, "mark_text": { "description": "Optional trademark text filter, such as \"stellar\".", "type": "string" }, "match_mode": { "default": "contains", "description": "How to match mark_text. Defaults to contains.", "enum": [ "contains", "exact", "starts_with" ], "type": "string" }, "nice_classes": { "description": "Optional Nice class filter.", "items": { "maximum": 45, "minimum": 1, "type": "integer" }, "type": "array" }, "recent_window_days": { "default": 180, "description": "For count, snapshot, and timeline, how many days back should count as recent.", "maximum": 730, "minimum": 1, "type": "integer" }, "start_date": { "description": "Optional inclusive filing-date start date in YYYY-MM-DD format.", "type": "string" }, "status_filter": { "default": "all", "description": "Optional status filter for the matched marks.", "enum": [ "all", "live", "dead", "registered", "pending" ], "type": "string" } }, "type": "object" }, "limit": { "default": 10, "description": "Maximum number of ranked rows, preview marks, or timeline events to return.", "maximum": 25, "minimum": 1, "type": "integer" }, "metric": { "description": "Required for count. Ranking currently supports filings only.", "enum": [ "filings", "pending_marks", "live_marks", "registered_marks", "recent_office_actions" ], "type": "string" }, "subject_name": { "description": "Required for count, snapshot, and timeline. Examples: \"Ideaya Biosciences\", \"Goodwin Procter\", or \"Todd Schneider\".", "type": "string" } }, "required": [ "analysis_type", "entity" ], "type": "object" }, "name": "run_safe_analytics", "outputSchema": { "properties": { "analysis_type": { "enum": [ "ranking", "count", "snapshot", "timeline" ], "type": "string" }, "count_result": { "anyOf": [ { "properties": { "label": { "type": "string" }, "matched_mark_count": { "type": "integer" }, "metric": { "enum": [ "filings", "pending_marks", "live_marks", "registered_marks", "recent_office_actions" ], "type": "string" }, "recent_office_action_mark_count": { "type": "integer" }, "recent_office_action_response_mark_count": { "type": "integer" }, "recent_window_days": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "value": { "type": "integer" } }, "required": [ "metric", "label", "value", "matched_mark_count", "recent_office_action_mark_count", "recent_office_action_response_mark_count" ], "type": "object" }, { "type": "null" } ] }, "entity": { "enum": [ "owner", "firm", "correspondent" ], "type": "string" }, "filters_applied": { "properties": { "end_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "event_scope": { "enum": [ "prosecution_activity", "office_actions", "office_action_responses" ], "type": "string" }, "mark_text": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "match_mode": { "enum": [ "contains", "exact", "starts_with" ], "type": "string" }, "nice_classes": { "items": { "type": "integer" }, "type": "array" }, "recent_window_days": { "type": "integer" }, "start_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "status_filter": { "enum": [ "all", "live", "dead", "registered", "pending" ], "type": "string" } }, "required": [ "match_mode", "status_filter", "nice_classes", "recent_window_days", "event_scope" ], "type": "object" }, "metric": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "open_in_gleanmark": { "type": "string" }, "rankings": { "items": { "properties": { "filing_count": { "type": "integer" }, "live_mark_count": { "type": "integer" }, "owner_detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "owner_name": { "type": "string" }, "pending_mark_count": { "type": "integer" }, "portfolio_preview": { "properties": { "live_mark_count": { "type": "integer" }, "matching_nice_classes": { "items": { "type": "integer" }, "type": "array" }, "pending_mark_count": { "type": "integer" }, "registered_mark_count": { "type": "integer" }, "sample_matching_marks": { "items": { "type": "string" }, "type": "array" }, "sample_other_marks": { "items": { "type": "string" }, "type": "array" }, "top_nice_classes": { "items": { "type": "integer" }, "type": "array" }, "total_mark_count": { "type": "integer" } }, "required": [ "total_mark_count", "live_mark_count", "registered_mark_count", "pending_mark_count", "matching_nice_classes", "sample_matching_marks", "top_nice_classes", "sample_other_marks" ], "type": "object" }, "position": { "type": "integer" }, "rank": { "type": "integer" }, "registered_mark_count": { "type": "integer" }, "share_percent": { "type": "number" } }, "required": [ "rank", "position", "owner_name", "filing_count", "live_mark_count", "registered_mark_count", "pending_mark_count", "share_percent", "portfolio_preview" ], "type": "object" }, "type": "array" }, "resolution": { "anyOf": [ { "properties": { "candidates": { "items": { "properties": { "canonical_name": { "type": "string" }, "detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "live_marks": { "type": "integer" }, "pending_marks": { "type": "integer" }, "registered_marks": { "type": "integer" }, "total_marks": { "type": "integer" } }, "required": [ "canonical_name", "detail_url", "total_marks", "live_marks", "registered_marks", "pending_marks" ], "type": "object" }, "type": "array" }, "clarification_question": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "message": { "type": "string" }, "status": { "enum": [ "resolved", "ambiguous", "no_match" ], "type": "string" } }, "required": [ "status", "message", "clarification_question", "candidates" ], "type": "object" }, { "type": "null" } ] }, "resolved_subject": { "anyOf": [ { "properties": { "canonical_name": { "type": "string" }, "dead_marks": { "type": "integer" }, "detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "entity": { "enum": [ "owner", "firm", "correspondent" ], "type": "string" }, "live_marks": { "type": "integer" }, "normalized_key": { "type": "string" }, "pending_marks": { "type": "integer" }, "registered_marks": { "type": "integer" }, "total_marks": { "type": "integer" } }, "required": [ "entity", "canonical_name", "normalized_key", "total_marks", "live_marks", "dead_marks", "registered_marks", "pending_marks" ], "type": "object" }, { "type": "null" } ] }, "returned": { "type": "integer" }, "snapshot_result": { "anyOf": [ { "properties": { "has_recent_office_actions": { "type": "boolean" }, "latest_prosecution_event_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "latest_status_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "marks": { "items": { "properties": { "detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "display_status": { "type": "string" }, "filing_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "has_recent_office_action": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ] }, "latest_activity_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "latest_activity_description": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "latest_office_action_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "latest_office_action_description": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "latest_response_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "latest_response_description": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "mark_identification": { "type": "string" }, "serial_number": { "type": "string" }, "status_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "serial_number", "mark_identification", "display_status", "filing_date", "status_date" ], "type": "object" }, "type": "array" }, "matched_live_mark_count": { "type": "integer" }, "matched_mark_count": { "type": "integer" }, "matched_pending_mark_count": { "type": "integer" }, "matched_registered_mark_count": { "type": "integer" }, "recent_office_action_event_count": { "type": "integer" }, "recent_office_action_mark_count": { "type": "integer" }, "recent_office_action_response_mark_count": { "type": "integer" }, "recent_window_days": { "type": "integer" } }, "required": [ "matched_mark_count", "matched_live_mark_count", "matched_registered_mark_count", "matched_pending_mark_count", "recent_window_days", "recent_office_action_mark_count", "recent_office_action_event_count", "recent_office_action_response_mark_count", "has_recent_office_actions", "marks" ], "type": "object" }, { "type": "null" } ] }, "subject_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "summary": { "type": "string" }, "timeline_result": { "anyOf": [ { "properties": { "event_scope": { "enum": [ "prosecution_activity", "office_actions", "office_action_responses" ], "type": "string" }, "events": { "items": { "properties": { "code": { "type": "string" }, "date": { "type": "string" }, "description": { "type": "string" }, "detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "event_category": { "type": "string" }, "mark_identification": { "type": "string" }, "serial_number": { "type": "string" } }, "required": [ "serial_number", "mark_identification", "date", "code", "description", "event_category" ], "type": "object" }, "type": "array" }, "latest_event_date": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "marks_with_events": { "type": "integer" }, "recent_window_days": { "type": "integer" }, "total_events": { "type": "integer" } }, "required": [ "event_scope", "recent_window_days", "total_events", "marks_with_events", "events" ], "type": "object" }, { "type": "null" } ] }, "title": { "type": "string" }, "total_matching_entities": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "total_matching_live_marks": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] }, "total_matching_marks": { "anyOf": [ { "type": "integer" }, { "type": "null" } ] } }, "required": [ "title", "summary", "analysis_type", "entity", "metric", "subject_name", "resolved_subject", "filters_applied", "open_in_gleanmark", "rankings", "count_result", "snapshot_result", "timeline_result", "resolution", "returned" ], "type": "object" } }, { "description": "Search GleanMark's USPTO trademark database and return citable results. Each result is a US trademark record with a stable id, a human-readable title (mark, owner and status) and a public gleanmark.com URL. Use the fetch tool with a returned id to read the full record. Covers 14M+ USPTO applications and registrations, live and dead.", "inputSchema": { "properties": { "query": { "description": "Search terms — a mark name, a brand, or an owner name. Example: \"spicy coke\" or \"Apple Inc\".", "type": "string" } }, "required": [ "query" ], "type": "object" }, "name": "search", "outputSchema": null }, { "description": "Search for trademark attorneys or law firms. Returns prosecution statistics, TTAB proceeding counts (as plaintiff/defendant), and contact information.", "inputSchema": { "properties": { "limit": { "default": 10, "description": "Maximum number of results to return", "maximum": 20, "minimum": 1, "type": "integer" }, "search_term": { "description": "Attorney name or law firm name to search for", "maxLength": 200, "minLength": 1, "type": "string" }, "search_type": { "default": "attorneys", "description": "Search for individual attorneys or law firms", "enum": [ "attorneys", "firms" ], "type": "string" } }, "required": [ "search_term" ], "type": "object" }, "name": "search_attorneys", "outputSchema": { "properties": { "open_in_gleanmark": { "type": "string" }, "query": { "type": "string" }, "results": { "items": { "oneOf": [ { "properties": { "detail_url": { "type": "string" }, "organization_detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "organization_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "person_name": { "type": "string" }, "primary_email": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "primary_key": { "type": "string" }, "prosecution_count": { "type": "integer" }, "similarity_score": { "type": "number" }, "ttab_defendant_count": { "type": "integer" }, "ttab_plaintiff_count": { "type": "integer" }, "ttab_proceeding_count": { "type": "integer" } }, "type": "object" }, { "properties": { "attorney_count": { "type": "integer" }, "canonical_firm_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "cluster_firm_ids": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ] }, "detail_url": { "type": "string" }, "organization_name": { "type": "string" }, "primary_key": { "type": "string" }, "prosecution_count": { "type": "integer" }, "similarity_score": { "type": "number" }, "ttab_defendant_count": { "type": "integer" }, "ttab_plaintiff_count": { "type": "integer" }, "ttab_proceeding_count": { "type": "integer" } }, "type": "object" } ] }, "type": "array" }, "search_type": { "enum": [ "attorneys", "firms" ], "type": "string" } }, "required": [ "query", "search_type", "results" ], "type": "object" } }, { "description": "Search for trademark owners by name. Use this to resolve or list candidate owners, not for owner counts, rankings, prosecution snapshots, or recent activity checks. Returns matching companies/individuals with their trademark portfolio statistics (total marks, live/dead counts, registered/pending).", "inputSchema": { "properties": { "limit": { "default": 10, "description": "Maximum number of owners to return", "maximum": 20, "minimum": 1, "type": "integer" }, "owner_name": { "description": "Owner name to search for (company or individual)", "maxLength": 200, "minLength": 1, "type": "string" } }, "required": [ "owner_name" ], "type": "object" }, "name": "search_by_owner", "outputSchema": { "properties": { "open_in_gleanmark": { "type": "string" }, "owners": { "items": { "properties": { "canonical_name": { "type": "string" }, "dead_marks": { "type": "integer" }, "detail_url": { "type": "string" }, "live_marks": { "type": "integer" }, "normalized_name": { "type": "string" }, "pending_marks": { "type": "integer" }, "registered_marks": { "type": "integer" }, "similarity_score": { "type": "number" }, "total_marks": { "type": "integer" } }, "type": "object" }, "type": "array" }, "query": { "type": "string" } }, "required": [ "query", "owners" ], "type": "object" } }, { "description": "Searches or counts U.S. trademarks by the colors they claim, parsed from USPTO color-claim statements. Two levels: level=\"family\" (16 color families; red also finds dark red, maroon and burgundy) and level=\"shade\" (the exact term claimed, e.g. dark red). match=\"all\" finds marks claiming at least the given colors, match=\"only\" marks claiming exactly those colors, and match=\"only_bw\" the same while also allowing black and white. claimed=false counts marks whose statement says color is not claimed. Modes: count, top_owners, list_marks, vocabulary (the valid families or shades with counts), explain_term (the family a shade belongs to) and by_serial (what one mark claims).", "inputSchema": { "properties": { "claimed": { "default": true, "description": "false = count marks whose statement disclaims colour (\"Color is not claimed as a feature of the mark\").", "type": "boolean" }, "colors": { "description": "Colour terms, e.g. [\"orange\",\"green\",\"red\"]. Must be real families or shades — call mode=\"vocabulary\" if unsure. Omit to match every colour-claiming mark.", "items": { "type": "string" }, "type": "array" }, "level": { "default": "family", "description": "family = 16 broad families (red covers maroon). shade = the exact claimed term.", "enum": [ "family", "shade" ], "type": "string" }, "limit": { "default": 20, "description": "Rows for top_owners, list_marks, vocabulary.", "maximum": 100, "minimum": 1, "type": "integer" }, "match": { "default": "all", "description": "all = claims at least these. only = claims exactly these, nothing else. only_bw = exactly these, allowing black/white (usually background).", "enum": [ "all", "only", "only_bw" ], "type": "string" }, "mode": { "default": "count", "description": "count = how many marks match. top_owners = who owns the most. list_marks = sample the matches. vocabulary = valid colour terms + corpus counts. explain_term = a shade's family. by_serial = what one mark claims.", "enum": [ "count", "top_owners", "list_marks", "vocabulary", "explain_term", "by_serial" ], "type": "string" }, "nice_class": { "description": "Restrict to one Nice class, e.g. \"25\" or \"025\".", "type": "string" }, "registration_number": { "description": "Registration number for mode=\"by_serial\"; resolved to its serial number automatically.", "type": "string" }, "serial_number": { "description": "Eight-digit serial number for mode=\"by_serial\".", "type": "string" }, "status": { "default": "any", "description": "registered/pending are narrower than live. \"How many live REGISTRATIONS\" means status=\"registered\".", "enum": [ "any", "live", "dead", "registered", "pending" ], "type": "string" }, "term": { "description": "Required for mode=\"explain_term\", e.g. \"maroon\".", "type": "string" } }, "required": [], "type": "object" }, "name": "search_claimed_colors", "outputSchema": null }, { "description": "Find US trademarks by USPTO design code — the codes examiners assign to the visual elements of a logo (26.17.01 = straight bands, 24.11 = crowns). Accepts dotted (26.17.01) or packed (261701) form. USPTO design vocabulary is literal and narrow: it records \"Bands, straight\" where a person says \"stripe\", and has no entry for words like \"swoosh\", so a plain shape word resolves to a code through mode=\"search_codes\" before marks can be counted or listed. Modes: count, top_owners, list_marks, by_serial (what codes one mark carries), describe_code, search_codes. Omitting mode infers it from the arguments supplied.", "inputSchema": { "properties": { "codes": { "description": "Design codes, dotted or packed, e.g. [\"26.17.01\"].", "items": { "type": "string" }, "type": "array" }, "limit": { "default": 20, "maximum": 100, "minimum": 1, "type": "integer" }, "match": { "default": "all", "description": "all = mark carries every code. any = at least one.", "enum": [ "all", "any" ], "type": "string" }, "mode": { "default": "count", "description": "search_codes = find a code from a word. describe_code = what a code means. count/top_owners/list_marks = marks carrying the codes. Omit it and the mode is inferred: query -> search_codes, serial_number/registration_number -> by_serial, codes -> count.", "enum": [ "count", "top_owners", "list_marks", "by_serial", "describe_code", "search_codes" ], "type": "string" }, "nice_class": { "description": "Restrict to one Nice class, e.g. \"25\".", "type": "string" }, "query": { "description": "Required for mode=\"search_codes\". A shape word: band, bar, circle, star, triangle, chevron, crown, leaf, arrow, shield.", "type": "string" }, "registration_number": { "description": "Registration number for mode=\"by_serial\"; resolved to its serial number automatically.", "type": "string" }, "serial_number": { "description": "Eight-digit serial number for mode=\"by_serial\".", "type": "string" }, "status": { "default": "any", "enum": [ "any", "live", "dead", "registered", "pending" ], "type": "string" } }, "required": [], "type": "object" }, "name": "search_design_codes", "outputSchema": null }, { "description": "Full-text search over the goods and services identifications of 14M USPTO marks, for questions such as which other owners claim a product in their goods (competitive landscape, descriptiveness or crowded-field evidence, identification drafting precedent). Keyword-based: the query is tokenized and matched against each mark's indexed goods keywords (match_mode all requires every keyword, any requires at least one). Rows include a short excerpt around the matched clause, not the full identification. mode=count returns how many marks claim the goods, with class and status breakdowns; mode=top_owners ranks the owners claiming them; neither returns rows. Searches goods and services text, not mark names; run_knockout_search and search_trademarks search mark names.", "inputSchema": { "properties": { "limit": { "default": 20, "description": "Max rows for list_marks mode (default 20).", "maximum": 100, "minimum": 1, "type": "integer" }, "match_mode": { "default": "all", "description": "all = every keyword must appear in the recitation (default); any = at least one.", "enum": [ "all", "any" ], "type": "string" }, "mode": { "default": "list_marks", "description": "list_marks returns rows; count returns totals + class/status breakdowns only; top_owners ranks owners by matching-mark count.", "enum": [ "list_marks", "count", "top_owners" ], "type": "string" }, "nice_classes": { "description": "Optional Nice class filter (e.g. [14] or [\"014\"]).", "items": { "type": [ "string", "integer" ] }, "maxItems": 10, "type": "array" }, "owner_contains": { "description": "Optional: only marks whose owner name contains this text.", "maxLength": 200, "minLength": 2, "type": "string" }, "sort": { "default": "relevance", "enum": [ "relevance", "filing_date_desc", "filing_date_asc", "registration_date_desc", "registration_date_asc", "owner_name", "recently_updated" ], "type": "string" }, "status_filter": { "default": "all", "description": "live = Registered + Pending; dead = Cancelled/Abandoned/Expired.", "enum": [ "all", "live", "dead", "registered", "pending" ], "type": "string" }, "text": { "description": "Goods/services text to search for (e.g. \"anti-tarnish\", \"vegan leather handbags\"). Words of 3+ characters are matched as keywords.", "maxLength": 500, "minLength": 3, "type": "string" } }, "required": [ "text" ], "type": "object" }, "name": "search_goods_services", "outputSchema": null }, { "description": "Searches the statements the USPTO records on a trademark: disclaimers (\"no claim is made to PIZZA apart from the mark\"), descriptions of the drawing (\"the mark consists of a red and white striped awning\"), translations of foreign wording, and claims of prior registrations. Answers questions such as which marks disclaim a word or which marks are described as stripes. Modes: count, top_terms, top_owners, list_marks, by_serial (every statement on one mark) and statement_types. mode=top_terms with nice_class ranks the most-disclaimed terms in a class with per-term mark counts (disclaimers only); its status filter accepts live (registered and pending together), any or dead, so a registered-only ranking is not available. A single term's registered-only count is available with mode=count, text set to the term, and status=registered. Color claims are searched with search_claimed_colors.", "inputSchema": { "properties": { "limit": { "default": 20, "maximum": 100, "minimum": 1, "type": "integer" }, "mode": { "default": "count", "enum": [ "count", "top_terms", "top_owners", "list_marks", "by_serial", "statement_types" ], "type": "string" }, "nice_class": { "description": "Restrict to one Nice class, e.g. \"25\".", "type": "string" }, "registration_number": { "description": "Registration number for mode=\"by_serial\"; resolved to its serial number automatically.", "type": "string" }, "serial_number": { "description": "Eight-digit serial number for mode=\"by_serial\".", "type": "string" }, "statement_type": { "description": "Required except for by_serial and statement_types.", "enum": [ "disclaimer", "description", "translation", "prior_marks" ], "type": "string" }, "status": { "default": "any", "enum": [ "any", "live", "dead", "registered", "pending" ], "type": "string" }, "text": { "description": "Free text to find inside the statement, minimum 3 characters (e.g. \"PIZZA\", \"stripe\"). Omit to count every mark carrying that statement type.", "type": "string" } }, "required": [], "type": "object" }, "name": "search_mark_statements", "outputSchema": null }, { "description": "Searches USPTO trademarks by name (14M records) and returns the closest whole-mark matches, ranked by similarity and prefix. It is not an exhaustive contains-search: multi-word marks that only contain the queried word rank low and are often cut (a KWIK query can miss KWIK REWARDS or KWIK KOPY); search_marks_by_pattern returns complete lists. A short result does not show that a name is absent from the register or available.", "inputSchema": { "properties": { "limit": { "default": 10, "description": "Maximum number of results to return", "maximum": 20, "minimum": 1, "type": "integer" }, "nice_classes": { "description": "Filter by Nice Classification classes (1-45)", "items": { "maximum": 45, "minimum": 1, "type": "integer" }, "maxItems": 5, "type": "array" }, "query": { "description": "Search query for trademark name", "maxLength": 200, "minLength": 1, "type": "string" }, "status_filter": { "default": "all", "description": "Filter by trademark status", "enum": [ "all", "live", "dead", "registered", "pending" ], "type": "string" } }, "required": [ "query" ], "type": "object" }, "name": "search_trademarks", "outputSchema": { "properties": { "open_in_gleanmark": { "type": "string" }, "query": { "type": "string" }, "results": { "items": { "properties": { "detail_url": { "type": "string" }, "filing_date": { "type": "string" }, "mark_name": { "type": "string" }, "mark_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "nice_classes": { "items": { "type": "integer" }, "type": "array" }, "owner": { "type": "string" }, "owner_detail_url": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "registration_number": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "serial_number": { "type": "string" }, "status": { "type": "string" } }, "type": "object" }, "type": "array" }, "total_count": { "type": "integer" } }, "required": [ "query", "total_count", "results" ], "type": "object" } }, { "description": "Search TTAB proceedings using the same discovery index as the GleanMark TTAB workspace. Use for broad proceeding discovery by party name, exact 8-digit proceeding number, 8-digit trademark serial number, or 7-digit registration number. Supports status, proceeding type, matched party role, and owner-name filters. For one known case after discovery, use get_ttab_proceeding_details; for owner enforcement statistics, use get_owner_ttab_enforcement.", "inputSchema": { "additionalProperties": false, "properties": { "limit": { "default": 25, "maximum": 100, "minimum": 1, "type": "integer" }, "owner_contains": { "description": "Optional additional substring that must appear in any party name.", "type": "string" }, "query": { "description": "Party name, 8-digit proceeding/serial number, or 7-digit registration number.", "type": "string" }, "role_filter": { "description": "Role of the party matched by query: P for plaintiff/petitioner, D for defendant/respondent.", "items": { "enum": [ "P", "D" ], "type": "string" }, "type": "array" }, "status_filter": { "items": { "enum": [ "active", "suspended", "not_instituted", "terminated" ], "type": "string" }, "type": "array" }, "type_filter": { "description": "TTAB proceeding type labels (exact values from the USPTO type table). Singular forms and codes are accepted too — \"Cancellation\" / \"CAN\" → Cancellations, \"Opposition\" / \"OPP\" → Oppositions, \"Extension\" / \"EXT\" → Extensions of Time to Oppose. NOTE: Monster Energy-style enforcers file far more Oppositions than Cancellations; a Cancellations filter returning 0-1 is usually the true answer, not an error.", "items": { "enum": [ "Oppositions", "Cancellations", "Extensions of Time to Oppose", "Concurrent Use", "Ex Parte Appeal", "Miscellaneous" ], "type": "string" }, "type": "array" } }, "required": [ "query" ], "type": "object" }, "name": "search_ttab_proceedings", "outputSchema": null }, { "description": "Search the USPTO Trademark ID Manual (pre-approved, surcharge-free goods & services identifications) by plain words. Call once per distinct product/service line (e.g. construction services and lighting products are two separate calls), not once per whole business. Returns selectable Term IDs; entries with {curly-brace} placeholders are fill-in templates.", "inputSchema": { "properties": { "classes": { "description": "Optional Nice class filter, 1-45 (padded or unpadded, e.g. 9 or \"009\")", "items": { "type": [ "string", "number" ] }, "maxItems": 45, "type": "array" }, "gs_type": { "description": "Optional filter to goods or services entries", "enum": [ "GOODS", "SERVICES" ], "type": "string" }, "limit": { "description": "Max suggestions (default 10)", "maximum": 20, "minimum": 1, "type": "integer" }, "query": { "description": "Plain-words description of ONE product or service line (e.g. \"phone cases with batteries\")", "maxLength": 500, "minLength": 3, "type": "string" } }, "required": [ "query" ], "type": "object" }, "name": "suggest_gs_descriptions", "outputSchema": { "properties": { "cta": { "type": "string" }, "open_in_gleanmark": { "type": "string" }, "suggestions": { "items": { "properties": { "class": { "type": "string" }, "description": { "type": "string" }, "gs_type": { "enum": [ "GOODS", "SERVICES" ], "type": "string" }, "is_template": { "type": "boolean" }, "match_type": { "enum": [ "exact", "prefix", "fts", "fts_partial", "trigram", "semantic" ], "type": "string" }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "term_id": { "type": "string" }, "tm5": { "type": "boolean" } }, "required": [ "term_id", "class", "description", "gs_type", "is_template", "match_type" ], "type": "object" }, "type": "array" } }, "required": [ "suggestions" ], "type": "object" } }, { "description": "Check a draft goods & services description against the USPTO ID Manual, clause by clause (clauses split on \";\"). Each clause comes back verbatim (selectable pre-approved entry), close (with up to 3 pre-approved substitutes), or freeform (subject to the USPTO $200/class free-form surcharge). Deterministic — no AI rewriting.", "inputSchema": { "properties": { "classes": { "description": "Optional Nice class scope, 1-45; without it exact matches may span classes", "items": { "type": [ "string", "number" ] }, "maxItems": 45, "type": "array" }, "text": { "description": "The draft goods & services description to validate", "maxLength": 8000, "minLength": 10, "type": "string" } }, "required": [ "text" ], "type": "object" }, "name": "validate_gs_description", "outputSchema": { "properties": { "clauses": { "items": { "properties": { "matched_terms": { "items": { "properties": { "class": { "type": "string" }, "description": { "type": "string" }, "gs_type": { "enum": [ "GOODS", "SERVICES" ], "type": "string" }, "is_template": { "type": "boolean" }, "match_type": { "enum": [ "exact", "prefix", "fts", "fts_partial", "trigram", "semantic" ], "type": "string" }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "term_id": { "type": "string" }, "tm5": { "type": "boolean" } }, "required": [ "term_id", "class", "description", "gs_type", "is_template", "match_type" ], "type": "object" }, "type": "array" }, "substitutes": { "items": { "properties": { "class": { "type": "string" }, "description": { "type": "string" }, "gs_type": { "enum": [ "GOODS", "SERVICES" ], "type": "string" }, "is_template": { "type": "boolean" }, "match_type": { "enum": [ "exact", "prefix", "fts", "fts_partial", "trigram", "semantic" ], "type": "string" }, "notes": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }, "term_id": { "type": "string" }, "tm5": { "type": "boolean" } }, "required": [ "term_id", "class", "description", "gs_type", "is_template", "match_type" ], "type": "object" }, "type": "array" }, "text": { "type": "string" }, "verdict": { "enum": [ "verbatim", "close", "freeform" ], "type": "string" } }, "required": [ "text", "verdict" ], "type": "object" }, "type": "array" }, "summary": { "properties": { "close_count": { "type": "integer" }, "freeform_count": { "type": "integer" }, "surcharge_note": { "type": "string" }, "verbatim_count": { "type": "integer" } }, "required": [ "verbatim_count", "close_count", "freeform_count", "surcharge_note" ], "type": "object" }, "truncated": { "type": "boolean" }, "unprocessed_clause_count": { "type": "integer" } }, "required": [ "clauses", "summary", "truncated" ], "type": "object" } }, { "description": "Research a company, trademark, or legal topic on the internet. Returns grounded results with source citations. Use for company background, recent news, common law trademark use, or case law research.", "inputSchema": { "properties": { "entity_name": { "description": "Company name, trademark, or topic to research", "type": "string" }, "mark_text": { "description": "Trademark text (for common_law_use and state_registrations searches)", "type": "string" }, "nice_classes": { "description": "Nice classes for context", "items": { "type": "integer" }, "type": "array" }, "research_type": { "description": "Type of research to perform", "enum": [ "company_background", "news", "common_law_use", "case_law", "state_registrations" ], "type": "string" } }, "required": [ "entity_name", "research_type" ], "type": "object" }, "name": "web_research", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:9df8470d8463d5b1c680c324d576dd726bc318a4b065b34e5b27b4f9d94485e2 | sha256sum