Screen a brand name against the USPTO federal register — sound, class, live status, risk verdict.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Offline name analysis: distinctiveness spectrum (fanciful / arbitrary / suggestive / descriptive / generic), phonetic collisions to check, and what to watch for. No live data — use with screen_trademark for the register check.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http trademark-clearance-mcp https://trademarkscreen.com/mcp
Offline name analysis: distinctiveness spectrum (fanciful / arbitrary / suggestive / descriptive / generic), phonetic collisions to check, and what to watch for. No live data — use with screen_trademark for the register check.
| Argument | Type | Description |
|---|---|---|
| name* | string | |
| goodsDescription | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name"
],
"properties": {
"name": {
"type": "string"
},
"goodsDescription": {
"type": "string"
}
},
"additionalProperties": false
}Check whether a brand name is free to register as a domain, across .com/.io/.ai/.co/.app/.dev/.net/.org (or a custom TLD list). Uses RDAP — the registry's own data, free, no key. 404 = not registered; 'unknown' = the TLD has no RDAP service. A free domain does NOT mean the trademark is clear, and a taken domain does not block the trademark — domains and trademarks are separate rights.
| Argument | Type | Description |
|---|---|---|
| name* | string | Brand name, e.g. NOVABREW — the .com etc. are checked for this exact string |
| tlds | array | TLDs to check, without the dot. Default: com, io, ai, co, app, dev, net, org |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Brand name, e.g. NOVABREW — the .com etc. are checked for this exact string"
},
"tlds": {
"type": "array",
"items": {
"type": "string"
},
"description": "TLDs to check, without the dot. Default: com, io, ai, co, app, dev, net, org"
}
},
"additionalProperties": false
}Check a brand name against EU + UK trademark registers via TMview (EUIPO-operated, offices EM + GB). Same similarity scoring as screen_trademark. BEST-EFFORT: TMview has no published API and resets connections from plain HTTP clients — when it will not answer, this returns { checked: false, reason } with a manual link instead of failing, and the US screen is unaffected. A clear EU/UK result is a signal, not clearance.
| Argument | Type | Description |
|---|---|---|
| name* | string | Proposed brand name, e.g. SUMMRISE |
| classes | array | Nice classes (1-45) if known; otherwise inferred from goodsDescription |
| goodsDescription* | string | What you sell — used to infer classes for the class-relatedness scoring |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"goodsDescription"
],
"properties": {
"name": {
"type": "string",
"description": "Proposed brand name, e.g. SUMMRISE"
},
"classes": {
"type": "array",
"items": {
"type": "integer",
"maximum": 45,
"minimum": 1
},
"description": "Nice classes (1-45) if known; otherwise inferred from goodsDescription"
},
"goodsDescription": {
"type": "string",
"description": "What you sell — used to infer classes for the class-relatedness scoring"
}
},
"additionalProperties": false
}Run a watch check now on all active watches (or one watch by id). Returns only NEW filings since the watch started / last check, scored by risk. The scheduled checker runs daily at 09:00; each watch is checked on its own cadence (daily by default). SCREEN ONLY — not clearance, not legal advice.
| Argument | Type | Description |
|---|---|---|
| id | string | Watch id to check alone; omit to check all |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"type": "string",
"description": "Watch id to check alone; omit to check all"
}
},
"additionalProperties": false
}Compare two names side-by-side: visual similarity, Jaro-Winkler, phonetic (Soundex) similarity, and an overall confusion score, with the factors an examiner would weigh on sound/appearance. Does not assess meaning, commercial impression, or class relatedness — use screen_trademark for that.
| Argument | Type | Description |
|---|---|---|
| nameA* | string | |
| nameB* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"nameA",
"nameB"
],
"properties": {
"nameA": {
"type": "string"
},
"nameB": {
"type": "string"
}
},
"additionalProperties": false
}List your trademark watches: mark, classes, threshold, created/last-checked, total alerts so far, and the most recent new hits. Private to one email — pass the email and the 6-digit code from request_watch_code, or a session token from a previous verification. No email addresses are ever returned.
| Argument | Type | Description |
|---|---|---|
| code | string | 6-digit code from request_watch_code, for the email above |
| string | Email address on your watches | |
| sessionToken | string | 60-minute watch session token from a previous verification |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"code": {
"type": "string",
"description": "6-digit code from request_watch_code, for the email above"
},
"email": {
"type": "string",
"description": "Email address on your watches"
},
"sessionToken": {
"type": "string",
"description": "60-minute watch session token from a previous verification"
}
},
"additionalProperties": false
}Send a 6-digit verification code to an email address, for watch access. Use it before list_watches, unwatch_mark, or attaching an email to a watch with watch_mark. The code expires in 10 minutes (5 tries); verifying it returns a 60-minute session token you can reuse. A code is sent even if the email has no watches, so the response never reveals whether an address has watches.
| Argument | Type | Description |
|---|---|---|
| email* | string | Email address to send the code to |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"description": "Email address to send the code to"
}
},
"additionalProperties": false
}Screen a brand name against the USPTO federal register. Returns ranked conflicting marks with sound/appearance similarity, class relatedness, live/dead status, and a plain-English risk verdict. SCREEN ONLY — not a clearance opinion, not legal advice. Pass format "csv" to get the same results as a spreadsheet (one row per hit) instead of JSON.
| Argument | Type | Description |
|---|---|---|
| name* | string | Proposed brand name, e.g. NOVABREW |
| format | string | Response format: 'json' (default, full result) or 'csv' (same results as a spreadsheet — one row per hit, for saving or sharing) |
| classes | array | Nice classes (1-45) if you know them; otherwise inferred from goodsDescription |
| includeDead | boolean | Also return dead/abandoned marks (lower risk, but useful context) |
| goodsDescription* | string | What you sell, e.g. 'music streaming app' or 'coffee shop' |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"goodsDescription"
],
"properties": {
"name": {
"type": "string",
"description": "Proposed brand name, e.g. NOVABREW"
},
"format": {
"enum": [
"json",
"csv"
],
"type": "string",
"default": "json",
"description": "Response format: 'json' (default, full result) or 'csv' (same results as a spreadsheet — one row per hit, for saving or sharing)"
},
"classes": {
"type": "array",
"items": {
"type": "integer",
"maximum": 45,
"minimum": 1
},
"description": "Nice classes (1-45) if you know them; otherwise inferred from goodsDescription"
},
"includeDead": {
"type": "boolean",
"default": false,
"description": "Also return dead/abandoned marks (lower risk, but useful context)"
},
"goodsDescription": {
"type": "string",
"description": "What you sell, e.g. 'music streaming app' or 'coffee shop'"
}
},
"additionalProperties": false
}Suggest Nice classes (1-45) for a goods/services description, with reasons. Pure reasoning — no live data needed.
| Argument | Type | Description |
|---|---|---|
| goodsDescription* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"goodsDescription"
],
"properties": {
"goodsDescription": {
"type": "string"
}
},
"additionalProperties": false
}Authoritative status for one mark by serial number (sn12345678) or registration number (rn1234567). Uses TSDR if a free key is set, otherwise the public Trademark Search record. Returns status, owner, classes, goods/services, dates.
| Argument | Type | Description |
|---|---|---|
| id* | string | Serial like sn98765432 or registration like rn1234567, or a bare number (treated as serial) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Serial like sn98765432 or registration like rn1234567, or a bare number (treated as serial)"
}
},
"additionalProperties": false
}Stop watching a mark. Removes it from future checks. If the watch has an email, you must prove you own it — pass the email and the 6-digit code from request_watch_code, or a session token. A watch with no email needs no verification.
| Argument | Type | Description |
|---|---|---|
| id* | string | Watch id (e.g. novabrew) or the mark name |
| code | string | 6-digit code from request_watch_code, for the email above |
| string | Email address on the watch | |
| sessionToken | string | 60-minute watch session token from a previous verification |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Watch id (e.g. novabrew) or the mark name"
},
"code": {
"type": "string",
"description": "6-digit code from request_watch_code, for the email above"
},
"email": {
"type": "string",
"description": "Email address on the watch"
},
"sessionToken": {
"type": "string",
"description": "60-minute watch session token from a previous verification"
}
},
"additionalProperties": false
}Start watching a mark for NEW confusingly similar filings. Runs a baseline screen first — everything already on the register is marked seen, so you are only alerted on filings that appear AFTER the watch starts. Returns the baseline hits (for context) and the watch id. Check with check_watches (or the scheduled checker — daily by default, or weekly / every N days if you set a schedule). An email is required — it is the watch's owner, and the digest goes there (needs RESEND_API_KEY on the server; without it the watch still works and records hits, and alerts start once email is switched on). The email must be verified first — call request_watch_code, then pass the email and code (or the session token); without verification the watch is refused, so nobody can attach someone else's inbox. SCREEN ONLY — not clearance, not legal advice.
| Argument | Type | Description |
|---|---|---|
| code | string | 6-digit code from request_watch_code, for the email above |
| name* | string | Your mark, e.g. NOVABREW |
| email* | string | Email address for new-filing alerts (required). Must be verified — see request_watch_code. |
| classes | array | Nice classes (1-45) if known; otherwise inferred |
| schedule | string | How often the scheduled checker looks at this watch: 'daily' (every morning, default), 'weekly' (Tuesdays after the Gazette), or 'custom' (every scheduleDays days) |
| threshold | number | Minimum risk score to alert on (0.45 = MEDIUM and up, 0.65 = MEDIUM-HIGH and up, 0.85 = HIGH only) |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 6, 2026.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.
| scheduleDays | integer | For schedule 'custom': check every N days (2–30) |
| sessionToken | string | 60-minute watch session token from a previous verification, for the email above |
| goodsDescription* | string | What you sell, e.g. 'music streaming app' |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"goodsDescription",
"email"
],
"properties": {
"code": {
"type": "string",
"description": "6-digit code from request_watch_code, for the email above"
},
"name": {
"type": "string",
"description": "Your mark, e.g. NOVABREW"
},
"email": {
"type": "string",
"description": "Email address for new-filing alerts (required). Must be verified — see request_watch_code."
},
"classes": {
"type": "array",
"items": {
"type": "integer",
"maximum": 45,
"minimum": 1
},
"description": "Nice classes (1-45) if known; otherwise inferred"
},
"schedule": {
"enum": [
"weekly",
"daily",
"custom"
],
"type": "string",
"default": "daily",
"description": "How often the scheduled checker looks at this watch: 'daily' (every morning, default), 'weekly' (Tuesdays after the Gazette), or 'custom' (every scheduleDays days)"
},
"threshold": {
"type": "number",
"default": 0.45,
"maximum": 1,
"minimum": 0,
"description": "Minimum risk score to alert on (0.45 = MEDIUM and up, 0.65 = MEDIUM-HIGH and up, 0.85 = HIGH only)"
},
"scheduleDays": {
"type": "integer",
"maximum": 30,
"minimum": 2,
"description": "For schedule 'custom': check every N days (2–30)"
},
"sessionToken": {
"type": "string",
"description": "60-minute watch session token from a previous verification, for the email above"
},
"goodsDescription": {
"type": "string",
"description": "What you sell, e.g. 'music streaming app'"
}
},
"additionalProperties": false
}