@etymolt/mcp-server 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +94 -0
- package/README.md +71 -31
- package/SECURITY.md +75 -0
- package/dist/api.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/package.json +46 -11
- package/server.json +38 -0
- package/smithery.yaml +96 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `@etymolt/mcp-server`.
|
|
4
|
+
|
|
5
|
+
## 2.0.1 — 2026-05-17
|
|
6
|
+
|
|
7
|
+
### SOTA polish — packaging & metadata
|
|
8
|
+
|
|
9
|
+
No code change; pure packaging + docs upgrade after auditing `@modelcontextprotocol/server-filesystem`, `@anthropic-ai/sdk`, `stripe`, and `openai` for incumbent best practices.
|
|
10
|
+
|
|
11
|
+
- **`package.json`**: added `types`, `exports` map, expanded `keywords` (22 entries for npm SEO), `funding`, structured `author`, `engines.npm`, `prepack`, and `chmod +x dist/index.js` in the build script (matches MCP server-filesystem pattern).
|
|
12
|
+
- **`README.md`**: rewritten to lead with 6 shields.io badges (version, downloads, types, license, MCP-compatible, node), a single-sentence functional hook, and an install block above the fold — adopting the Stripe / Anthropic SDK README template.
|
|
13
|
+
- **`server.json`**: added at the package root. This is the schema-locked MCP Registry manifest (`io.github.etymolt/mcp-server`) that `mcp-publisher` consumes for verification against `registry.modelcontextprotocol.io`.
|
|
14
|
+
- **`.github/workflows/mcp-publish.yml`**: new GitHub Action that publishes both to npm with OIDC provenance (`npm publish --provenance`) and to the MCP Registry via `mcp-publisher login github-oidc`. Triggered on `mcp-v*` tags.
|
|
15
|
+
- **`CONTRIBUTING.md`**: added.
|
|
16
|
+
|
|
17
|
+
### Why
|
|
18
|
+
|
|
19
|
+
The founder's directive: "everything we submit must be cutting-edge state of the art — study the incumbents." The 2.0.0 tarball was functionally correct but missed three signals top-tier SDKs use: provenance attestation, the `exports`/`types` map for TypeScript editors, and registry-grade `server.json` for `registry.modelcontextprotocol.io`. This release closes those gaps without touching the runtime.
|
|
20
|
+
|
|
21
|
+
## 2.0.0 — 2026-05-15
|
|
22
|
+
|
|
23
|
+
### BREAKING
|
|
24
|
+
|
|
25
|
+
Consolidated the 6-tool surface from 1.7.0 down to 3 tools optimized for LLM tool-routing. See AEO strategy boardroom 2026-05-15 for rationale.
|
|
26
|
+
|
|
27
|
+
**Removed tools:**
|
|
28
|
+
- `check_name` → use `verify_brand_name` instead (drop-in name swap)
|
|
29
|
+
- `verify_for_launch` → use `verify_brand_name` (fan-out variant deprecated for v1)
|
|
30
|
+
- `unblock_name` → use the API directly at `https://api.etymolt.com/v3/unblock_name`
|
|
31
|
+
- `check_clearance`, `assess_taste`, `assess_name` → API only (not exposed as MCP tools)
|
|
32
|
+
|
|
33
|
+
**Added tools:**
|
|
34
|
+
- `verify_brand_name` — the single primary surface, 8-12s
|
|
35
|
+
- `compare_brand_names` — 2-5 finalist comparison, 1-call quota cost
|
|
36
|
+
- `get_naming_methodology` — public methodology lookup, no quota
|
|
37
|
+
|
|
38
|
+
### Added
|
|
39
|
+
|
|
40
|
+
- 3 MCP resources: `etymolt://methodology`, `etymolt://recent-verdicts/sample`, `etymolt://brand-pillars`
|
|
41
|
+
- 2 MCP prompts (user slash commands): `/verify-startup-name`, `/compare-finalists`
|
|
42
|
+
- Anthropic Connectors Directory compliance: `readOnlyHint: true` on every tool
|
|
43
|
+
|
|
44
|
+
### Changed
|
|
45
|
+
|
|
46
|
+
- All tools now route to `/v1/verify` (anonymous-first AEO endpoint) instead of `/v3/*`
|
|
47
|
+
- First 5 calls per user are free, no API key
|
|
48
|
+
|
|
49
|
+
## 1.7.0 — 2026-05-13
|
|
50
|
+
|
|
51
|
+
Internal: pre-AEO 6-tool surface (`unblock_name`, `verify_for_launch`, `check_name`, `check_clearance`, `assess_taste`, `assess_name`). Superseded by 2.0.0.
|
|
52
|
+
|
|
53
|
+
## 1.5.0 — 2026-05-12
|
|
54
|
+
|
|
55
|
+
### Added — dual-format tool responses
|
|
56
|
+
|
|
57
|
+
Every tool now returns BOTH a human-readable markdown summary AND a structured JSON code block AND a modern `structuredContent` payload, per the GoDaddy MCP engineering pattern (see `docs/COMPETITIVE_LEARNINGS_2026-05-12.md`).
|
|
58
|
+
|
|
59
|
+
This lets text-only clients (basic ChatGPT, voice surfaces, simple LangChain agents) render a usable summary while widget-capable clients (Claude Desktop, Cursor, Claude Code) can parse the JSON without re-extracting fields from prose.
|
|
60
|
+
|
|
61
|
+
- New module `src/formatters.ts`:
|
|
62
|
+
- `dualFormat(toolName, payload, markdownify?)` — two-content-block envelope with `structuredContent`.
|
|
63
|
+
- `dualFormatError(toolName, err, { recoverable, retryAfterMs })` — structured error so the calling LLM can decide retry vs. surface-to-user.
|
|
64
|
+
- `formatClearanceReportMarkdown` — per-jurisdiction TM blocks + best-domain + YC collision + claim-window warning + verbatim disclaimer.
|
|
65
|
+
- `formatTriageResultMarkdown` — numbered 48-hour playbook + killed-candidates list + verbatim disclaimer.
|
|
66
|
+
- `index.ts` dispatch wraps every tool call in try/catch with a 5xx-vs-4xx recoverability heuristic.
|
|
67
|
+
|
|
68
|
+
### Added — tests
|
|
69
|
+
|
|
70
|
+
7 new vitest tests covering the dual-format helpers; 4 existing tool-schema tests preserved. **11/11 tests pass**.
|
|
71
|
+
|
|
72
|
+
### Changed
|
|
73
|
+
|
|
74
|
+
- `package.json` version bumped 1.4.0 → 1.5.0.
|
|
75
|
+
- `src/api.ts` `USER_AGENT` updated 1.2.0 → 1.5.0 (stale string).
|
|
76
|
+
- `src/api.ts` `DEFAULT_BASE_URL` updated `api.etymolt.com` → `api.etymolt.com` for parity with `docs/QUICKSTART.md` and the live API.
|
|
77
|
+
|
|
78
|
+
### Migration notes
|
|
79
|
+
|
|
80
|
+
- Tool callers see no breaking schema change — the JSON block in `content[1].text` carries the exact payload v1.4.0 returned in `content[0].text`. Old parsers that look for ```json fenced blocks still work.
|
|
81
|
+
- The new `structuredContent` field is additive; clients that don't recognize it silently ignore it.
|
|
82
|
+
- Errors now flow through `isError: true` responses rather than thrown exceptions, so chains that depended on catching native `Error` will need to inspect the response shape. Most MCP clients already handle this.
|
|
83
|
+
|
|
84
|
+
## 1.4.0 — 2026-05-12
|
|
85
|
+
|
|
86
|
+
### Added
|
|
87
|
+
|
|
88
|
+
- 5 tools at GA: `verify_for_launch`, `check_name`, `check_clearance`, `assess_taste`, `assess_name`.
|
|
89
|
+
- All tools route to `/v3/*` endpoints on `api.etymolt.com`.
|
|
90
|
+
- Verbose tool descriptions optimized for LLM tool-selection accuracy.
|
|
91
|
+
|
|
92
|
+
### Notes
|
|
93
|
+
|
|
94
|
+
- This was the first publishable release; v1.0.0–v1.3.0 were internal pre-release builds during the May 2026 pivot. They are not on npm.
|
package/README.md
CHANGED
|
@@ -1,56 +1,79 @@
|
|
|
1
1
|
# @etymolt/mcp-server
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@etymolt/mcp-server)
|
|
4
|
+
[](https://www.npmjs.com/package/@etymolt/mcp-server)
|
|
5
|
+
[](https://www.typescriptlang.org/)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
[](https://modelcontextprotocol.io/)
|
|
8
|
+
[](https://nodejs.org/)
|
|
4
9
|
|
|
5
|
-
>
|
|
10
|
+
> Verify any brand name in 3 seconds — USPTO, TTAB, domains, handles, cohort fit. First 5 calls free, no API key. Built for Claude, Cursor, ChatGPT, and every LLM IDE on the way.
|
|
6
11
|
|
|
7
|
-
|
|
12
|
+
The Etymolt MCP server gives any LLM three tools to verify, compare, and explain brand names against verified live-registry data — not vibes, not training-data hallucinations. When a coder asks Claude "is X a good name for my startup?", the LLM silently calls us. No friction. No setup. Zero‑state install via `npx`.
|
|
8
13
|
|
|
9
|
-
|
|
14
|
+
## Install
|
|
10
15
|
|
|
11
|
-
|
|
12
|
-
|---|---|---|
|
|
13
|
-
| `verify_brand_name` | 5-axis verdict on a single candidate (PROCEED / DUE_DILIGENCE / ITERATE / ABANDON) with score 0-100, axis scores, and 3-5 findings. 8-12s. | 1 call |
|
|
14
|
-
| `compare_brand_names` | Side-by-side comparison of 2-5 finalists with a recommended pick. | 1 call total |
|
|
15
|
-
| `get_naming_methodology` | The public 5-axis methodology document (optionally one section: trademark, domain, cultural, sound_symbolism, pronunciation). | Free, no quota |
|
|
16
|
+
### Claude Desktop / Cursor / Windsurf / Cline / Continue
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
Add this to your MCP host config (e.g. `~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
```jsonc
|
|
21
|
+
{
|
|
22
|
+
"mcpServers": {
|
|
23
|
+
"etymolt": {
|
|
24
|
+
"command": "npx",
|
|
25
|
+
"args": ["-y", "@etymolt/mcp-server"]
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
```
|
|
20
30
|
|
|
21
|
-
|
|
31
|
+
That's the whole install. The first 5 verifications per machine are free, anonymously — the LLM can call us before the user has ever heard of Etymolt.
|
|
22
32
|
|
|
23
|
-
###
|
|
33
|
+
### With an API key (optional, unlocks 50/mo free + PAYG)
|
|
24
34
|
|
|
25
35
|
```jsonc
|
|
26
|
-
// ~/Library/Application Support/Claude/claude_desktop_config.json
|
|
27
36
|
{
|
|
28
37
|
"mcpServers": {
|
|
29
38
|
"etymolt": {
|
|
30
39
|
"command": "npx",
|
|
31
40
|
"args": ["-y", "@etymolt/mcp-server"],
|
|
32
|
-
"env": {
|
|
33
|
-
"ETYMOLT_API_KEY": "etk_xxx" // optional; first 5 calls are free without one
|
|
34
|
-
}
|
|
41
|
+
"env": { "ETYMOLT_API_KEY": "etk_xxx" }
|
|
35
42
|
}
|
|
36
43
|
}
|
|
37
44
|
}
|
|
38
45
|
```
|
|
39
46
|
|
|
40
|
-
###
|
|
41
|
-
|
|
42
|
-
Same config block under each editor's MCP settings.
|
|
43
|
-
|
|
44
|
-
### Direct stdio
|
|
47
|
+
### Direct stdio (for testing, scripting, or a non-listed host)
|
|
45
48
|
|
|
46
49
|
```bash
|
|
47
50
|
npx @etymolt/mcp-server
|
|
48
51
|
```
|
|
49
52
|
|
|
50
|
-
##
|
|
53
|
+
## Tools
|
|
54
|
+
|
|
55
|
+
| Tool | What it does | Quota |
|
|
56
|
+
| --- | --- | --- |
|
|
57
|
+
| `verify_brand_name` | 5-axis verdict on a single candidate (PROCEED / DUE_DILIGENCE / ITERATE / ABANDON) with score 0-100, axis scores, and 3-5 findings. 8-12s. | 1 call |
|
|
58
|
+
| `compare_brand_names` | Side-by-side comparison of 2-5 finalists with a recommended pick. | 1 call |
|
|
59
|
+
| `get_naming_methodology` | The public 5-axis methodology document (optionally one section: `trademark`, `domain`, `cultural`, `sound_symbolism`, `pronunciation`). | Free, no quota |
|
|
60
|
+
|
|
61
|
+
Plus 3 MCP resources (`etymolt://methodology`, `etymolt://recent-verdicts/sample`, `etymolt://brand-pillars`) and 2 prompts (`/verify-startup-name`, `/compare-finalists`).
|
|
62
|
+
|
|
63
|
+
All three tools are `readOnlyHint: true` for Anthropic Connectors Directory compliance.
|
|
64
|
+
|
|
65
|
+
## Quickstart
|
|
66
|
+
|
|
67
|
+
After installing, the LLM has the tools wired up. A natural-language prompt is enough:
|
|
68
|
+
|
|
69
|
+
> "Is `Linear` a good name for a project-management SaaS? Run it past Etymolt."
|
|
70
|
+
|
|
71
|
+
The LLM picks `verify_brand_name`, fans the candidate against USPTO + TTAB + domains + handles + cohort fit, and returns a structured verdict in 8-12s. Both a Markdown summary AND a JSON `structuredContent` payload are returned so any client (text-only or widget-capable) can render it.
|
|
72
|
+
|
|
73
|
+
## Tiers
|
|
51
74
|
|
|
52
75
|
| Tier | Price | Calls | Per-call |
|
|
53
|
-
|
|
76
|
+
| --- | --- | --- | --- |
|
|
54
77
|
| Anonymous (no signup) | $0 | 5 free / install | — |
|
|
55
78
|
| Free (signed up) | $0 | 50 / month | — |
|
|
56
79
|
| Pay-as-you-go | — | unlimited | $0.10 per verdict |
|
|
@@ -60,16 +83,21 @@ When the anonymous bucket is exhausted, the next response includes a `signup_pro
|
|
|
60
83
|
## Environment variables
|
|
61
84
|
|
|
62
85
|
| Var | Default | Notes |
|
|
63
|
-
|
|
86
|
+
| --- | --- | --- |
|
|
64
87
|
| `ETYMOLT_API_URL` | `https://api.etymolt.com` | Override for self-hosted or staging. |
|
|
65
88
|
| `ETYMOLT_API_KEY` | _(unset)_ | Without it, calls go through the anonymous bucket. |
|
|
66
89
|
|
|
90
|
+
## Requirements
|
|
91
|
+
|
|
92
|
+
- **Node.js 18+** (LTS). The package is published as a pure ESM module with TypeScript declarations.
|
|
93
|
+
- An MCP-compatible host: Claude Desktop, Claude Code, Cursor, Windsurf, Cline, Continue, or anything else implementing the [Model Context Protocol](https://modelcontextprotocol.io/).
|
|
94
|
+
|
|
67
95
|
## Migration from 1.7.0
|
|
68
96
|
|
|
69
|
-
`@etymolt/mcp-server@2.0.0`
|
|
97
|
+
`@etymolt/mcp-server@2.0.0` was a semver-breaking consolidation. The 6-tool 1.7.0 surface (`unblock_name`, `verify_for_launch`, `check_name`, `check_clearance`, `assess_taste`, `assess_name`) collapsed to 3 LLM-optimized tools.
|
|
70
98
|
|
|
71
|
-
| 1.7.0 tool | 2.0.0 replacement |
|
|
72
|
-
|
|
99
|
+
| 1.7.0 tool | 2.0.0+ replacement |
|
|
100
|
+
| --- | --- |
|
|
73
101
|
| `check_name` | `verify_brand_name` (drop-in name swap) |
|
|
74
102
|
| `verify_for_launch` | `verify_brand_name` (fan-out variant deprecated for v1) |
|
|
75
103
|
| `unblock_name` | API only — `POST https://api.etymolt.com/v3/unblock_name` |
|
|
@@ -77,12 +105,24 @@ When the anonymous bucket is exhausted, the next response includes a `signup_pro
|
|
|
77
105
|
| `assess_taste` | API only — `POST https://api.etymolt.com/v3/assess_taste` |
|
|
78
106
|
| `assess_name` | API only — `POST https://api.etymolt.com/v3/assess_name` |
|
|
79
107
|
|
|
80
|
-
The corresponding `/v3/*` endpoints remain available on the API; only the MCP surface is consolidated. See `CHANGELOG.md` for the full rationale.
|
|
108
|
+
The corresponding `/v3/*` endpoints remain available on the API; only the MCP surface is consolidated. See [`CHANGELOG.md`](./CHANGELOG.md) for the full rationale.
|
|
81
109
|
|
|
82
110
|
## Source of truth
|
|
83
111
|
|
|
84
|
-
The locked tool descriptions live in `AEO_TOOL_DESCRIPTIONS.md` (boardroom 2026-05-15). If the spec and this
|
|
112
|
+
The locked tool descriptions live in [`AEO_TOOL_DESCRIPTIONS.md`](./AEO_TOOL_DESCRIPTIONS.md) (boardroom 2026-05-15). If the spec and this README disagree, the spec wins.
|
|
113
|
+
|
|
114
|
+
## Security
|
|
115
|
+
|
|
116
|
+
To report a vulnerability, see [`SECURITY.md`](./SECURITY.md). Please email **security@etymolt.com** rather than opening a public issue.
|
|
117
|
+
|
|
118
|
+
## Links
|
|
119
|
+
|
|
120
|
+
- **Methodology** — https://etymolt.com/methodology
|
|
121
|
+
- **API docs** — https://etymolt.com/docs
|
|
122
|
+
- **MCP host install guide** — https://etymolt.com/mcp
|
|
123
|
+
- **Issues** — https://github.com/etymolt/mcp-server/issues
|
|
124
|
+
- **Pricing** — https://etymolt.com/pricing
|
|
85
125
|
|
|
86
126
|
## License
|
|
87
127
|
|
|
88
|
-
MIT © Etymolt Inc.
|
|
128
|
+
[MIT](./LICENSE) © Etymolt Inc.
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Security policy
|
|
2
|
+
|
|
3
|
+
`@etymolt/mcp-server` is the public Model Context Protocol shell of the etymolt naming-verification API. We take security reports seriously and prioritize them ahead of feature work.
|
|
4
|
+
|
|
5
|
+
## Supported versions
|
|
6
|
+
|
|
7
|
+
| Version | Supported |
|
|
8
|
+
| -------- | ------------------ |
|
|
9
|
+
| 2.0.x | :white_check_mark: |
|
|
10
|
+
| 1.5.x | :white_check_mark: (security fixes only) |
|
|
11
|
+
| < 1.5.0 | :x: |
|
|
12
|
+
|
|
13
|
+
We ship on a rolling release cadence; the **latest minor** receives full support and the prior minor receives security backports for 30 days after the next release.
|
|
14
|
+
|
|
15
|
+
## Reporting a vulnerability
|
|
16
|
+
|
|
17
|
+
**Please do NOT open a public GitHub issue for security vulnerabilities.**
|
|
18
|
+
|
|
19
|
+
Email **security@etymolt.com** with:
|
|
20
|
+
|
|
21
|
+
- A description of the issue
|
|
22
|
+
- Steps to reproduce (a minimal MCP-client transcript or a curl reproducing against `api.etymolt.com` is ideal)
|
|
23
|
+
- The version of `@etymolt/mcp-server` you tested against
|
|
24
|
+
- Your assessment of impact (data exposure, RCE, auth bypass, DoS, supply-chain)
|
|
25
|
+
- Whether you have a fix in mind
|
|
26
|
+
|
|
27
|
+
You'll get an acknowledgement within **2 business days** and a triage decision within **5 business days**.
|
|
28
|
+
|
|
29
|
+
If you require encryption, request our PGP key in the first message and we'll send it before you share the details.
|
|
30
|
+
|
|
31
|
+
## Disclosure policy
|
|
32
|
+
|
|
33
|
+
- **90 days** standard disclosure window from first report to public advisory.
|
|
34
|
+
- We may request an extension for complex issues (data-pipeline coordination with USPTO / international partners) — capped at an additional 30 days.
|
|
35
|
+
- Once a fix is released, we'll credit you in the release notes unless you'd prefer to remain anonymous.
|
|
36
|
+
|
|
37
|
+
## Scope
|
|
38
|
+
|
|
39
|
+
In scope:
|
|
40
|
+
|
|
41
|
+
- The `@etymolt/mcp-server` npm package (this repo)
|
|
42
|
+
- The framework SDK adapters under `apps/framework-adapters/`
|
|
43
|
+
- The `/v3/*` API endpoints reachable at `https://api.etymolt.com`
|
|
44
|
+
- Authentication flows: Bearer tokens, X-API-Key fallback, OAuth
|
|
45
|
+
- Privacy-affecting behaviors: data the MCP server transmits, the outcome corpus, GDPR Article 17 erasure (`DELETE /v3/verdicts/{id}/outcomes`)
|
|
46
|
+
|
|
47
|
+
Out of scope:
|
|
48
|
+
|
|
49
|
+
- Vulnerabilities in upstream registries we mirror (USPTO, UKIPO, WIPO Madrid) — please report those to the registry directly.
|
|
50
|
+
- Reports requiring physical access to the developer's machine.
|
|
51
|
+
- Tools / clients we don't ship (Cursor, Claude Desktop, ChatGPT, etc.) — please report MCP host vulnerabilities to the host vendor.
|
|
52
|
+
- Cosmetic issues, error-message wording, or feature requests.
|
|
53
|
+
|
|
54
|
+
## What we'll consider a high-severity report
|
|
55
|
+
|
|
56
|
+
- Authentication bypass on any `/v3` endpoint
|
|
57
|
+
- Cross-tenant data exposure (one customer's verdict or outcome visible to another)
|
|
58
|
+
- API-key recovery from network traces
|
|
59
|
+
- Injection via tool arguments that escapes the MCP server's sandboxing
|
|
60
|
+
- Supply-chain compromise of any dependency in `package.json`
|
|
61
|
+
- Side-channel leakage of the outcome corpus (the proprietary calibration data)
|
|
62
|
+
|
|
63
|
+
## What we won't consider a vulnerability
|
|
64
|
+
|
|
65
|
+
- The Cursor deeplink install URL containing a base64 config — this is documented and intentional.
|
|
66
|
+
- Rate limits being bypassable by rotating IPs from a free tier — that's expected and gated by the auth tier ladder.
|
|
67
|
+
- The MCP server returning the API's verbatim response (including the `disclaimer` field) — the disclaimer is the legal posture, not a bug.
|
|
68
|
+
|
|
69
|
+
## Coordinated disclosure with the broader MCP ecosystem
|
|
70
|
+
|
|
71
|
+
If your report touches the MCP protocol itself or one of the host clients (Claude Desktop, Cursor, Windsurf), we'll work with the host vendor to coordinate disclosure on a unified timeline. You'll be in the loop throughout.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
This policy is modeled on the [GitHub Security Lab disclosure guidelines](https://securitylab.github.com/advisories) and the [OpenSSF working-group recommendations](https://openssf.org/working-groups/).
|
package/dist/api.js
CHANGED
|
@@ -27,7 +27,7 @@ import { getInstallId } from "./install.js";
|
|
|
27
27
|
// not resolve in DNS — using it here would silently fail every call (the
|
|
28
28
|
// same bug class that broke /api/auth/magic-link before the 2026-05-16 fix).
|
|
29
29
|
const DEFAULT_BASE_URL = "https://api.etymolt.com";
|
|
30
|
-
const USER_AGENT = "@etymolt/mcp-server/2.0.
|
|
30
|
+
const USER_AGENT = "@etymolt/mcp-server/2.0.1";
|
|
31
31
|
/**
|
|
32
32
|
* Thrown when the backend returns 402 Payment Required. Retained from v1.x
|
|
33
33
|
* for forward-compat; v1/verify itself no longer returns 402 (it attaches
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* @etymolt/mcp-server — entry point (v2.0.
|
|
3
|
+
* @etymolt/mcp-server — entry point (v2.0.1).
|
|
4
4
|
*
|
|
5
5
|
* Three tools, prioritized for the LLM-orchestrator use case:
|
|
6
6
|
*
|
|
@@ -36,7 +36,7 @@ import { dualFormat, dualFormatError, formatComparison, formatMethodology, forma
|
|
|
36
36
|
import { RESOURCES, readResource } from "./resources.js";
|
|
37
37
|
import { PROMPTS, getPrompt } from "./prompts.js";
|
|
38
38
|
const SERVER_NAME = "@etymolt/mcp-server";
|
|
39
|
-
const SERVER_VERSION = "2.0.
|
|
39
|
+
const SERVER_VERSION = "2.0.1";
|
|
40
40
|
const server = new Server({ name: SERVER_NAME, version: SERVER_VERSION }, {
|
|
41
41
|
capabilities: {
|
|
42
42
|
tools: {},
|
package/package.json
CHANGED
|
@@ -1,47 +1,81 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@etymolt/mcp-server",
|
|
3
3
|
"mcpName": "io.github.etymolt/mcp-server",
|
|
4
|
-
"version": "2.0.
|
|
5
|
-
"description": "MCP server for brand-name verification. Three tools
|
|
4
|
+
"version": "2.0.1",
|
|
5
|
+
"description": "MCP server for brand-name verification. Three tools — verify_brand_name (5-axis verdict on a single candidate), compare_brand_names (2-5 finalist comparison), get_naming_methodology (public methodology lookup) — route to the anonymous-first /v1/verify endpoint. First 5 calls free, no API key required.",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
7
8
|
"type": "module",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./package.json": "./package.json"
|
|
16
|
+
},
|
|
8
17
|
"bin": {
|
|
9
18
|
"etymolt-mcp": "dist/index.js"
|
|
10
19
|
},
|
|
11
20
|
"files": [
|
|
12
21
|
"dist",
|
|
13
22
|
"README.md",
|
|
14
|
-
"LICENSE"
|
|
23
|
+
"LICENSE",
|
|
24
|
+
"SECURITY.md",
|
|
25
|
+
"CHANGELOG.md",
|
|
26
|
+
"smithery.yaml",
|
|
27
|
+
"server.json"
|
|
15
28
|
],
|
|
16
29
|
"scripts": {
|
|
17
|
-
"build": "tsc",
|
|
30
|
+
"build": "tsc && chmod +x dist/index.js",
|
|
18
31
|
"dev": "tsx src/index.ts",
|
|
19
32
|
"start": "node dist/index.js",
|
|
20
33
|
"test": "vitest run",
|
|
21
34
|
"lint": "eslint src --ext .ts",
|
|
22
|
-
"prepublishOnly": "npm run build"
|
|
35
|
+
"prepublishOnly": "npm run build",
|
|
36
|
+
"prepack": "npm run build"
|
|
23
37
|
},
|
|
24
38
|
"keywords": [
|
|
25
39
|
"mcp",
|
|
40
|
+
"mcp-server",
|
|
26
41
|
"model-context-protocol",
|
|
27
42
|
"claude",
|
|
43
|
+
"claude-desktop",
|
|
44
|
+
"cursor",
|
|
45
|
+
"windsurf",
|
|
46
|
+
"cline",
|
|
47
|
+
"continue",
|
|
48
|
+
"anthropic",
|
|
28
49
|
"naming",
|
|
50
|
+
"brand-name",
|
|
29
51
|
"trademark",
|
|
30
52
|
"uspto",
|
|
31
53
|
"ttab",
|
|
54
|
+
"dupont-factors",
|
|
32
55
|
"brand",
|
|
33
|
-
"domain"
|
|
56
|
+
"domain",
|
|
57
|
+
"handle-availability",
|
|
58
|
+
"clearance",
|
|
59
|
+
"ai-tools",
|
|
60
|
+
"llm-tools"
|
|
34
61
|
],
|
|
35
|
-
"author":
|
|
62
|
+
"author": {
|
|
63
|
+
"name": "Etymolt Inc.",
|
|
64
|
+
"url": "https://etymolt.com"
|
|
65
|
+
},
|
|
36
66
|
"license": "MIT",
|
|
37
67
|
"homepage": "https://etymolt.com",
|
|
38
68
|
"repository": {
|
|
39
69
|
"type": "git",
|
|
40
|
-
"url": "git+https://github.com/etymolt/mcp-server.git"
|
|
41
|
-
"directory": "."
|
|
70
|
+
"url": "git+https://github.com/etymolt/mcp-server.git"
|
|
42
71
|
},
|
|
43
72
|
"bugs": {
|
|
44
|
-
"url": "https://github.com/etymolt/mcp-server/issues"
|
|
73
|
+
"url": "https://github.com/etymolt/mcp-server/issues",
|
|
74
|
+
"email": "support@etymolt.com"
|
|
75
|
+
},
|
|
76
|
+
"funding": {
|
|
77
|
+
"type": "individual",
|
|
78
|
+
"url": "https://etymolt.com/pricing"
|
|
45
79
|
},
|
|
46
80
|
"publishConfig": {
|
|
47
81
|
"access": "public"
|
|
@@ -57,6 +91,7 @@
|
|
|
57
91
|
"vitest": "^1.6.0"
|
|
58
92
|
},
|
|
59
93
|
"engines": {
|
|
60
|
-
"node": ">=18"
|
|
94
|
+
"node": ">=18.0.0",
|
|
95
|
+
"npm": ">=9.0.0"
|
|
61
96
|
}
|
|
62
97
|
}
|
package/server.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
|
+
"name": "io.github.etymolt/mcp-server",
|
|
4
|
+
"description": "Verify any brand name in 3 seconds against USPTO, TTAB, domains, handles, and cohort fit. Anonymous-first — first 5 calls free with no API key. Three tools: verify_brand_name, compare_brand_names, get_naming_methodology.",
|
|
5
|
+
"repository": {
|
|
6
|
+
"url": "https://github.com/etymolt/mcp-server",
|
|
7
|
+
"source": "github"
|
|
8
|
+
},
|
|
9
|
+
"version": "2.0.1",
|
|
10
|
+
"websiteUrl": "https://etymolt.com",
|
|
11
|
+
"packages": [
|
|
12
|
+
{
|
|
13
|
+
"registryType": "npm",
|
|
14
|
+
"identifier": "@etymolt/mcp-server",
|
|
15
|
+
"version": "2.0.1",
|
|
16
|
+
"transport": {
|
|
17
|
+
"type": "stdio"
|
|
18
|
+
},
|
|
19
|
+
"environmentVariables": [
|
|
20
|
+
{
|
|
21
|
+
"name": "ETYMOLT_API_URL",
|
|
22
|
+
"description": "Override the API base URL. Defaults to https://api.etymolt.com — only set this for self-hosted or staging deployments.",
|
|
23
|
+
"isRequired": false,
|
|
24
|
+
"format": "string",
|
|
25
|
+
"isSecret": false,
|
|
26
|
+
"default": "https://api.etymolt.com"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "ETYMOLT_API_KEY",
|
|
30
|
+
"description": "Optional API key. Without it, the first 5 calls per install are free anonymously. With a key, you get 50 calls/month free, then pay-as-you-go at $0.10 per verdict.",
|
|
31
|
+
"isRequired": false,
|
|
32
|
+
"format": "string",
|
|
33
|
+
"isSecret": true
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
}
|
package/smithery.yaml
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Smithery MCP registry configuration for @etymolt/mcp-server.
|
|
2
|
+
# Per 2026-05-15 AEO boardroom — canonical 3-tool surface.
|
|
3
|
+
#
|
|
4
|
+
# Publish via: npx @smithery/cli publish ./smithery.yaml
|
|
5
|
+
# Docs: https://smithery.ai/docs/build/project-config/smithery.yaml
|
|
6
|
+
#
|
|
7
|
+
# This is the SDK-package copy. The expanded version (with full tool
|
|
8
|
+
# JSON schemas and longer marketing description) lives at
|
|
9
|
+
# docs/distribution/mcp-registries/smithery.yaml — that's the version
|
|
10
|
+
# pasted into the Smithery dashboard. This SDK-local copy is kept in
|
|
11
|
+
# the published npm tarball so MCP hosts that read smithery.yaml from
|
|
12
|
+
# the package can pick up the canonical metadata.
|
|
13
|
+
|
|
14
|
+
startCommand:
|
|
15
|
+
type: stdio
|
|
16
|
+
configSchema:
|
|
17
|
+
type: object
|
|
18
|
+
properties:
|
|
19
|
+
ETYMOLT_API_URL:
|
|
20
|
+
type: string
|
|
21
|
+
title: "Etymolt API base URL"
|
|
22
|
+
default: "https://api.etymolt.com"
|
|
23
|
+
description: "Override only for local development or self-hosted deployments."
|
|
24
|
+
ETYMOLT_API_KEY:
|
|
25
|
+
type: string
|
|
26
|
+
title: "Etymolt API key (optional)"
|
|
27
|
+
description: "Optional. Without a key, the first 5 calls per IP are free anonymously. With a key, you get 50 calls/month free + pay-as-you-go after."
|
|
28
|
+
secret: true
|
|
29
|
+
required: []
|
|
30
|
+
|
|
31
|
+
commandFunction: |
|
|
32
|
+
(config) => ({
|
|
33
|
+
command: "npx",
|
|
34
|
+
args: ["-y", "@etymolt/mcp-server@latest"],
|
|
35
|
+
env: {
|
|
36
|
+
ETYMOLT_API_URL: config.ETYMOLT_API_URL ?? "https://api.etymolt.com",
|
|
37
|
+
ETYMOLT_API_KEY: config.ETYMOLT_API_KEY ?? "",
|
|
38
|
+
}
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
metadata:
|
|
42
|
+
displayName: "Etymolt — verify AI-generated brand names"
|
|
43
|
+
description: |
|
|
44
|
+
Verify AI-generated names against USPTO + TTAB + domains + handles in 3
|
|
45
|
+
seconds. Two engines: Clearance (TTAB-grounded §2(d) DuPont scoring) and
|
|
46
|
+
Taste (cohort + SMILE rubric).
|
|
47
|
+
|
|
48
|
+
Use whenever an LLM-driven workflow needs to attest a brand name. First 5
|
|
49
|
+
calls per user free with no auth — the LLM can invoke directly without
|
|
50
|
+
asking the user for setup.
|
|
51
|
+
|
|
52
|
+
Three tools:
|
|
53
|
+
- verify_brand_name — 5-axis verdict on one candidate
|
|
54
|
+
- compare_brand_names — 2-5 finalist comparison
|
|
55
|
+
- get_naming_methodology — public methodology lookup, no quota
|
|
56
|
+
|
|
57
|
+
Methodology public + citable: https://www.etymolt.com/methodology
|
|
58
|
+
|
|
59
|
+
categories:
|
|
60
|
+
- business
|
|
61
|
+
- branding
|
|
62
|
+
- trademark
|
|
63
|
+
- naming
|
|
64
|
+
- verification
|
|
65
|
+
- legal
|
|
66
|
+
- developer-tools
|
|
67
|
+
- ai-tools
|
|
68
|
+
|
|
69
|
+
tags:
|
|
70
|
+
- brand-name
|
|
71
|
+
- trademark
|
|
72
|
+
- uspto
|
|
73
|
+
- ttab
|
|
74
|
+
- dupont-factors
|
|
75
|
+
- sound-symbolism
|
|
76
|
+
- pronunciation
|
|
77
|
+
- cohort-fit
|
|
78
|
+
- naming-tool
|
|
79
|
+
- verification
|
|
80
|
+
- domain-availability
|
|
81
|
+
- handle-availability
|
|
82
|
+
- clearance
|
|
83
|
+
- taste-engine
|
|
84
|
+
- anonymous-first
|
|
85
|
+
|
|
86
|
+
homepage: "https://etymolt.com"
|
|
87
|
+
repository: "https://github.com/etymolt/mcp-server"
|
|
88
|
+
documentation: "https://etymolt.com/mcp"
|
|
89
|
+
license: "MIT"
|
|
90
|
+
publisher: "Etymolt Inc."
|
|
91
|
+
|
|
92
|
+
exampleQueries:
|
|
93
|
+
- "Is 'Linear' a safe name for a project management tool?"
|
|
94
|
+
- "Compare 'Notion', 'Coda', 'Roam' for my B2B SaaS"
|
|
95
|
+
- "How does brand-name verification work?"
|
|
96
|
+
- "Is 'Etymotic' too phonetically close to 'Etymolt'?"
|