Check from your AI assistant whether a name is already a registered or pending
trademark in the US (USPTO) and the EU
(EUIPO), by Nice class and by the words of a mark's
goods and services, before you buy the domain or draw the logo. Read one mark,
and follow a US mark's file step by step, its documents saved as a PDF. Every
tool only reads public registers: nothing is filed, and the one file written
is that PDF, in the server's own outbox.
You need nothing to search the US: no account and no key. A US mark's
history and documents need a free USPTO TSDR API key. EU marks need an EUIPO
app's client id and secret with a Trademark Search subscription, which EUIPO
approves by hand (allow a week or more). Romania's OSIM, WIPO and the other
national offices are not searched, and every result says so.
What you can ask
- "Is Turnip already a trademark for software, in the US or the EU?"
- "Search Blue Night in classes 9 and 42, dead marks included, and show me what
sounds alike."
- "Which live US marks contain the word talon and cover mobile applications?"
- "What happened in the file of the closest US match? Was it opposed?"
- "Save the office actions in that mark's file since January 2025 as one PDF."
Install
[Install in VS Code] [Install in Cursor] [Download for Claude Desktop]
With Claude Code:
Claude Desktop (Settings, Developer, Edit Config) and most other clients read the same command as JSON:
Each runs the published package on Node 22.19 or newer. VS Code and the Claude Desktop bundle ask for each setting as they add the server; leave an optional one empty. Cursor reads each from your environment instead (${env:USPTO_TSDR_API_KEY_FILE} and so on), so set them before you start Cursor. Every setting is optional; Configuration says which ones you need for which tools.
From a clone
In a JSON configuration, the command is node and its one argument the full path of servers/trademarks/dist/index.js. To share one running copy between several clients over HTTP, see docs/deploying.md.
Configuration
Every setting is optional. A missing credential never stops the server: its
source shows as not_configured in health, a search marks its office as not
searched, and the TSDR tools answer a config failure, each with the remedy.
What each tool needs:
Getting a USPTO TSDR API key
- Create a USPTO.gov account at https://account.uspto.gov: free, with
two-step sign-in and no identity verification (unlike the Open Data
Portal's key, which needs ID.me).
- Open the API key manager,
https://account.uspto.gov/profile/api-manager, and request a key for the
TSDR API. An Open Data Portal key is a different key, which TSDR
refuses.
- Write the key to a file only the server's user can read, and point
USPTO_TSDR_API_KEY_FILE at it. A key expires after a year; the manager
shows when, and renews it.
Getting EUIPO credentials
- Create an EUIPO user account, and sign in at https://dev.euipo.europa.eu.
- Under Apps, register an app. It gets a client id and a secret: write each
to a file only the server's user can read.
- Subscribe the app to the Trademark Search product (production, or sandbox
for test data), accepting its terms of use. "Most subscription requests
are subject to approval", and EUIPO emails the account when it approves.
Until then, EUIPO issues a token but refuses the call, and
health shows
EM as pending.
The server reaches tmsearch.uspto.gov, tsdrapi.uspto.gov,
api.euipo.europa.eu and euipo.europa.eu (the token endpoint), and, when
the sandbox is used, api-sandbox.euipo.europa.eu and
auth-sandbox.euipo.europa.eu; a deployment that sets MCP_EGRESS_ALLOW must
allow them. The variables every server shares (transport, limits, egress) are
in docs/configuration.md.
First run
- Ask your assistant to run the trademark server's
health check: each
source's state, with what it needs. ok is true when at least one source
searches and no configured source fails, so pending and not_configured
do not fail a deployment's health check.
- Search a name you know is taken, in its classes, to see what a hit looks
like before you rely on a miss.
Tools
Every tool is read: it changes nothing anywhere, and
download_mark_documents writes only into the server's own outbox.
search_marks takes the name as written (a name, not a pattern: no *);
offices (EM, US, RO, WO, default all four, so those not searched say
so); classes (Nice classes 1 to 45, default every class); goods, words
that must appear together, in order, in a mark's goods and services; match:
exact (the mark is the name), word (it contains the name) or similar
(the default: also what sounds alike or is a letter off); status: live
(the default: registered and pending) or all; and limit, the marks listed
per office (1 to 100, default 20).
Troubleshooting
An office says searched: false. Read its reason or error. RO and WO
are never searched here, and the reason says where a person can look; EM with
a config error means no EUIPO credentials yet. An office not searched is not
clear.
config from the TSDR tools. There is no TSDR key: get one
(above), or read the mark's file by hand at
tsdr.uspto.gov.
auth. From TSDR: check in the API key manager that the key is a TSDR
API key (an Open Data Portal key is refused) and has not expired. From EUIPO:
compare the client id and secret with the app's, under Apps at
dev.euipo.europa.eu.
subscription, or EM pending in health. EUIPO accepted the app but
not the call: its Trademark Search subscription is missing or still waiting
for approval (step 3). Until then, search EU
marks by hand at https://euipo.europa.eu/eSearch.
not_found. A USPTO serial number has 8 digits, an EUIPO application
number 9, leading zeros included.
unsupported. That office has no source here, or EM was asked for a
mark's file, which EUIPO's API does not give. The message says where to look.
rate_limited. The register was still throttling after three tries
(TSDR allows 60 reads a minute and 4 document downloads): wait a minute and
ask for less at a time.
api. A refusal, a server error that outlived its retries, or no
connection (status 0). Retry in a minute; if it persists, run health. A 401
or 403 from USPTO's search may mean it now requires its page's browser
challenge, which this server never answers.
drift. The register answered in a shape this server does not know, or
refused a query the server built. The US search is an undocumented backend
USPTO may change without notice; please report it.
How it works
What a result says
Each office answers in its own section, in one of three ways: searched
(found, the register's own count of candidates; examined, how many came
back; more when it holds more than that; counts and marks); not searched
because no source covers the office (reason, with where a person can look);
or not searched because its source failed or has no credentials (error with
its remedy). So an empty marks list always means "searched, nothing
found", never "could not look".
- The relation is computed here, the same for every office. Case, accents,
spaces and punctuation are ignored, so "Blue Night", "BLUENIGHT" and
"blue-night" are
identical; a mark holding the name (TURNIP QPT, STURNIP)
contains it; anything else the source returned is similar.
- Registers find by words. A two-word name searched at USPTO finds the
marks written as one word and as two alike, while the same name searched as
one word misses marks written as two. Search a compound spaced as well.
- Goods are filtered by the register, so only where its source can. USPTO's
search can; EUIPO's search API cannot (goods and services come only with one
mark's details). Each searched office says which in
goods_filter:
applied, or unsupported, its marks then listed unfiltered. Classes say
where a mark could conflict; goods say whether it really does, as class 9
covers both software and sunglasses.
- Order: identical marks, then those containing the name, then similar
ones. Within the first two, registered before pending; within similar ones,
the most alike first by the score below, then the source's own relevance.
- A mark's
classes are those it covers now. USPTO lists a class it has
cancelled from a mark as "(CANCELLED) IC 035", and such a class does not
count for a class filter. A dead mark keeps the classes it had.
The similarity score
Every mark with words carries similarity, 0 to 100, computed here the same
way for every office, so USPTO and EUIPO candidates share one scale. Half is
how the marks are written: the edit distance between the folded texts (TURNIP
and DURNIP are one letter apart). Half is how they sound: the edit distance
between phonetic keys, which rewrite the spellings of one sound (ph and f, ck
and k, a soft c or g, a silent gh or final e), put letters that sound alike in
one class (d and t, b and p, m and n, every vowel), and collapse repeats, so
TURNIP, DURNIP, TERNIP and DURNNIP share one key. TURNIP scores 100 against
TURNIP, 92 against DURNIP and 67 against TURNIP QPT: the score compares whole
marks, so a mark that contains the name scores lower the more it adds, and its
relation says it contains the name. The keys suit names in the Latin
alphabet. The score knows nothing of goods and services or of what an examiner
would decide, and a logo with no words has none.
Sources (researched 2026-10-05)
Each source gets one request at a time across every session the process
serves: USPTO's search one a second, TSDR one a second and a document bundle
every fifteen seconds, EUIPO four a second. A 429 or a server error is tried
up to three times.
USPTO search. USPTO's documented APIs do not search by name: TSDR answers
by serial or registration number only, and the Open Data Portal
(data.uspto.gov) offers bulk data (since 2026-06-18 only to a USPTO.gov
account with MFA and, for its API key, ID.me verification). So the server uses
the backend of USPTO's own Trademark Search page: its public
https://tmsearch.uspto.gov/configuration.json names the base
(serviceUrlSearchElastic), and POST <base>tmsearch takes the
Elasticsearch query the page builds (buildQueryTree in its bundle). It
answers a plain request with an honest User-Agent, no key and no challenge.
The page loads an AWS WAF challenge script, whose token the backend did not
require when this was researched; this server never answers or imitates it.
- Terms: USPTO's "Terms of Use for USPTO websites" (updated 2026-08-13)
deny access to whoever generates "unusually high numbers of database
accesses (searches, pages, or hits), whether generated manually or in an
automated fashion", and say the online databases are not a source for bulk
downloads. They do not forbid automated access as such, and US government
records are not under copyright. One request per name, at most one a
second, is far below either line.
- Risk: the backend is undocumented and unversioned, so
health marks it
official: false (Limitations).
- Goods and services are the index's
GS field, asked as the page's own
refinement asks (match_phrase), through USPTO's analyser. The index keeps
the text of classes a mark has cancelled, so a mark whose words appear only
there is left out; one whose words appear nowhere in its text (USPTO matched
a plural or a stem) is kept.
similar reaches the index's phonetic field (WMP5: a d for a t,
another vowel, a doubled letter), a prefix match, one or two letters' edit
distance, and recorded translations: a mark recorded as meaning the name
matches it, and comes back with its translation.
TSDR is USPTO's official Trademark Status and Document Retrieval API ("TSDR
API v1"), with the key in the USPTO-API-KEY header.
GET /casestatus/sn<serial>/info gives the status (USPTO's code, its sentence
extStatusDesc, the summary tm5StatusDesc such as "LIVE/REGISTRATION/Issued
and Active", and the key dates) and prosecutionHistory, every step with its
date, code and description; a step's date is a timestamp at Eastern midnight,
so the day is its first ten characters. GET /casedocs/sn<serial>/info lists
the documents, as XML only (JSON gets a 406), with no id of their own, so a
download picks by type and date:
GET /casedocs/bundle.pdf?sn=&type=&fromDate=&toDate=, saved and checked to
start as a PDF does. A mark is registered, pending or dead by its
summary's first words, the same rule search_marks uses. health reads the
status of USPTO's own documentation example (78787878). The shapes were
recorded from public serials; the test fixtures invent every name, number,
address and date.
EUIPO. The Trademark Search API (OpenAPI 1.1.0, from
dev.euipo.europa.eu/product/trademark-search_110) covers EU trade marks and
international registrations designating the EU: GET /trademarks with an
RSQL query (the verbal element supports == with * wildcards; no fuzzy or
phonetic search), classes, status and pages of 10 to 100, and
GET /trademarks/{applicationNumber} for one mark; 25,000 calls a day on the
default plan. "Subscription requests for the Sandbox environment can take up
to a week. However, requests for the Production environment may take a bit
longer" (Getting started). Auth is OAuth2 client credentials (scope uid) at
EUIPO's token endpoint, giving a two-hour token kept in memory only, plus
X-IBM-Client-Id on every request. EUIPO withholds an applicant's name until
the filing fee is paid, so such a mark lists no owners.
- Not yet run against the live API. The adapter is built to the spec and
tested against it. Two things the spec leaves open are handled defensively:
whether
== ignores case (each comparison is asked in the name's own,
upper, lower and title case), and whether * works inside a quoted value (a
name is quoted only when it holds a space or an RSQL character).
Not searched.
- OSIM (Romania): its own search (
https://api.osim.ro:8443/tm-registry)
redirects every visitor to a reCAPTCHA page, and OSIM publishes no API. An
EU mark also covers Romania, so EM answers part of the question.
- WIPO: the Global Brand Database has no public API (the one in WIPO's
catalogue is for collaborating IP offices); its terms forbid automated
queries, bulk downloading and scraping, and call more than 10 search actions
a minute from one IP excessive
(wipo.int/en/web/global-brand-database/terms_and_conditions, section 2.1);
its pages carry a proof-of-work captcha. International registrations still
show up where they designate the EU (EM) or the US (serial numbers
79xxxxxx).
- TMview (tmdn.org/tmview) covers EUIPO, OSIM, USPTO, WIPO and most
national offices in one search, from an undocumented JSON backend
(
POST /tmview/api/search/results) that resets any connection whose
User-Agent is not a browser's, so using it means passing as a browser. The
legal notice tmdn.org's legal page leads to
(euipn.org/en/info/legal-notices, read 2026-10-05) reserves the data "by any
means, including bots, scrapers, or other automated processes", "except as
specifically and explicitly authorised by the EUIPO in writing"
(TDM-RESERVATION: 1). With that authorisation it would be the one source
for every office; until then, check RO and the rest there by hand.
Trying it
npx tsx scripts/smoke.ts [name ...] drives the built server against the
real registers: health, each name in classes 9, 35 and 42 in every office,
then get_mark on the first US mark found. A search takes about a second,
nearly all of it the one US request.
Limitations
- A name check, not a clearance opinion. Likelihood of confusion also
turns on goods and services, and on similarity no string comparison sees.
- The US search is undocumented and unofficial. USPTO can change or close
it without notice; a shape the server does not know fails as
drift, never
as "nothing found".
- RO (OSIM), WO (WIPO) and the offices only TMview covers are not
searched. Each result says so, and where a person can look.
- EUIPO's search is by words: no phonetic or fuzzy match there, so
similar reaches less in EM than in the US.
- A mark's file comes from the US only. EUIPO's API gives an EU mark's
status and status date, not its history or documents.
Other servers for trademark registers
Searched 2026-10-15. No trademark office publishes one: none from USPTO,
EUIPO, WIPO or OSIM in the MCP Registry, on their sites or on GitHub. What
else exists:
- Clarivate's CompuMark Trademark MCP: remote, needs a CompuMark
subscription, claims 188 databases.
- MarkMesh: remote, an API key, more than 30 registers, a monthly fee
after a trial.
- None was found from Corsearch, Markify or Trademarkia.
- Antevo's trademark server: remote and free, no account; screens a name
in 19 registers including US and EM, some through TMview, with no class
filter and no lookup by number.
- TrademarkMind: remote; covers the US register and WIPO's Madrid
register, and checks logos too; its operator is unnamed.
patent_mcp_server: open source; covers the US only, through the same
USPTO backend as this one.
- Others cover the US alone (Goalie IP, GleanMark) or look up a US mark by
number.
None of them combines what this one does: it asks each office directly and
nothing else, so a name under consideration reaches no third party; it uses
only sources whose terms do not forbid automated access, never answers USPTO's
bot challenge, and does not use TMview or WIPO; every office answers for
itself, and one not searched says why instead of reading as clear; it filters
by Nice class and reads one mark by number in both offices; and it runs
self-hosted. The services above reach more offices: for RO and the rest, they
or TMview by hand are the wider net.