ip-free-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ip-free-mcpIs the name Northwind free in classes 9 and 42?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ip-free-mcp
An MCP server for EU and Benelux trademark research, and company lookup over free, public sources. No API keys. No subscription. No per-call billing.
Ask your assistant "is the name Northwind free in classes 9 and 42?" and get a verdict backed by the actual registers — which marks are live, which expired, who holds them, and what they cover. Then ask "who is that holder?" and get their legal form, national register number, and group structure.
tm_clearance("Northwind", [9, 42])
→ NAME FREE, but live similar rights exist in your classes
identical + live ......... 0
identical but expired .... 2 the name was claimed once and let go
live overlap in 9/42 ..... 1 a figurative mark, same classes, valid to 2031(Illustrative. Run it on your own name for real numbers.)
Why this exists
The hosted IP MCP servers all want credentials. The official EUIPO API needs a developer account and a plan subscription on top of it, and until that subscription is approved every query returns HTTP 403.
The trap: at least one commercial MCP server repackages that 403 as
"No trademarks found". An empty result then looks like a clean name while nothing was
ever retrieved. That is a decision-grade error, and it bills you per call for the
privilege.
This server sidesteps the whole problem. It reads the same registers through endpoints that are public and free, and it tells you which source answered.
Related MCP server: ENTIA Entity Verification
What it can do
Tool | What it gives you |
| Start here. A verdict on one name in EU + Benelux, split into identical-and-live, identical-but-expired, and live look-alikes in your Nice classes. |
| Raw search across TMview. EU + Benelux by default, live rights only; flip |
| The full EUIPO case file for an EU application number: status, filing/registration/expiry dates, renewals, holder, oppositions, and the complete goods-and-services text per class. |
| The register codes you can pass to |
| Find a company by name: legal form, status, address, national register number, LEI. Turns a mark holder into a known entity. |
| The full GLEIF record for a LEI, plus group structure — direct parent, ultimate parent, subsidiaries. |
| Verify an EU VAT number and get the officially registered name and address back. |
| Find a Dutch company in the Handelsregister by trade name, city, postcode or domain — including the SMEs GLEIF misses. |
| Full Handelsregister profile: legal name, all trade names, legal form, RSIN, addresses. |
| The VAT number for a KVK number — feed it to |
| Group structure for a KVK number: parents, subsidiaries and UBO. |
ᵖ = optional, paid, and off unless you configure credentials. Everything above the line
is free and needs no setup.
| eu_company_search | Search thirteen national company registers by name at once — AT, CH, CZ, DK, EE, FI, FR, IE, LT, LV, NO, SI, SK. |
| eu_company_by_number | Look a company up by its national number — ten registers, e.g. CZ by IČO, CH by UID, RO by CUI, MT by MBR number, PL by NIP/REGON. |
| eu_company_sources | Which countries have a free register, which don't, why — and where a VAT number gets you the name for free instead. |
Install
Requires Node 18 or newer. Nothing else — the server has zero dependencies.
Claude Code
claude mcp add --scope user ip-free -- npx -y github:AI-AlexBaum/IP-MCPClaude Desktop / Cursor / any MCP client — add to your config:
{
"mcpServers": {
"ip-free": {
"command": "npx",
"args": ["-y", "github:AI-AlexBaum/IP-MCP"]
}
}
}From a clone
git clone https://github.com/AI-AlexBaum/IP-MCP.git
cd IP-MCP && npm run smoke # verifies all four tools against the live registers
node src/index.js # speaks MCP over stdioReading a clearance result
tm_clearance returns four buckets, and the difference between them is the whole point.
{
"name": "Northwind",
"classes_checked": [9, 42],
"registers": ["EU (EUIPO)", "Benelux (NL/BE/LU)"],
"verdict": "NAME FREE, but live similar rights exist in your classes",
"identical_and_live": [], // blocks you outright
"identical_but_expired": [ // free again — but shows who tried
{ "mark": "NORTHWIND", "type": "Word", "status": "Ended",
"application_date": "1998-03-11", "classes": [37, 42], "holder": ["Example Corp"] }
],
"similar_live_in_your_classes": [ // the real risk surface
{ "mark": "Northwind Pro", "type": "Figurative", "status": "Registered",
"number": "0XXXXXXXX", "classes": [9, 35, 42],
"holder": ["Another Example GmbH"] }
],
"live_in_benelux": [], // your home market specifically
"counts": { "raw": 5, "live": 1, "identical_live": 0, "class_overlap": 1 }
}Four verdicts are possible:
TAKEN— an identical live mark exists in your classes. Pick another name.IDENTICAL MARK EXISTS, but in other classes— same name, different field. Often workable.NAME FREE, but live similar rights exist in your classes— nobody owns the name, but someone nearby is registered where you operate. Readsimilar_live_in_your_classes.FREE— no live identical mark and no class overlap.
Then feed a number from any result into tm_detail to see what that right actually
covers, whether it was ever opposed, and how long it runs.
Company lookup
A trademark search hands you a holder name. These three tools turn that into something you can act on.
company_search("KIRKBI", land: "DK")
→ KIRKBI A/S · ACTIVE · register no. 18591235
LEI 5493005XXPWUMR2E5305
company_detail("5493005XXPWUMR2E5305")
→ direct parent ..... none (top of its group, or the parent holds no LEI)
subsidiaries ...... 2
vat_check("DK47458714")
→ valid · Lego System A/S · Åstvej 1, 7190 BillundThe two sources answer different questions, and neither is a company register:
GLEIF is the global LEI database. It searches by name and exposes group structure, which no free company register does. Its limit is coverage: only entities that hold a LEI are in it. Large companies and anything active in financial markets almost always are; a lot of SMEs are not. An empty result means no LEI, not no company.
VIES is the EU's VAT validation service. It confirms a number is live and returns the name and address the national tax authority holds — which makes it the stronger check when you already have the number. You cannot search it by name.
For a Dutch B.V. with no LEI there is no free, keyless source at all. That needs the KVK handelsregister, which requires an account and, for production use, a paid plan.
Dutch companies (optional, paid)
GLEIF stops at entities that hold a LEI, which leaves out most Dutch B.V.s. The four
nl_company_* tools close that gap through Company.info (Webservices.nl), a commercial
Handelsregister reseller. They are billed per query, so they stay disabled until you supply
credentials — and they are listed either way, so the assistant can tell you what to set
rather than silently returning nothing.
Configure them in your MCP client, never in this repository:
{
"mcpServers": {
"ip-free": {
"command": "npx",
"args": ["-y", "github:AI-AlexBaum/IP-MCP"],
"env": {
"COMPANYINFO_USERNAME": "your-user",
"COMPANYINFO_PASSWORD": "your-password",
"COMPANYINFO_WSDL_URL": "https://ws1.webservices.nl/soap_doclit"
}
}
}
}COMPANYINFO_WSDL_URL is optional and defaults to
https://ws1.webservices.nl/soap_doclit.php; a trailing ?wsdl is stripped for you.
Called without credentials, every one of these tools returns an explicit not configured error naming the variables to set. It never degrades into an empty result.
The chain that makes this worth it:
tm_clearance("SomeName") → holder: Some Holding B.V. (free)
nl_company_search("Some Holding") → KVK 12345678 (paid, €)
nl_company_profile("12345678") → all trade names, legal form, RSIN (paid, €)
nl_company_vat("12345678") → NL123456789B01 (paid, €)
vat_check("NL123456789B01") → confirms name and address (free)
nl_company_tree("12345678") → who owns whom (paid, €)nl_company_profile returns all_trade_names, and for trademark work that is the field
that matters most: in the Netherlands a trade name right arises from use, with no
registration to search. It is the one right a register sweep cannot find, and this is the
closest you get to it.
Privacy.
nl_company_treereturns names of natural persons — UBOs and directors. That is personal data under the GDPR. Do not pass it on more widely than the task needs, and do not paste it into anything public.
National company registers
GLEIF covers only entities that hold a LEI. Most companies do not. So eu_company_search
goes straight to the national registers — the same data, at the source, free and without a
key. Leave country out and it queries all thirteen name-searchable registers
concurrently:
eu_company_search("Nordic", max_results: 1)
→ AT Club Nordic POW GmbH 627228w St. Anton am Arlberg
CH Nordic Bau GmbH i. L. CHE-285.995.250 Signalstrasse 8, 9400 Rorschach
CZ Nordic Invest s.r.o. 01582119 Primátorská 296/38, 18000 Praha 8
IE NORDIC ENTERPRISE PARK … 365842 Unit 15, Midleton, Co. Cork
LV SIA "Nordic Superfoods AG" 40203536952 Sigulda, Rasas iela 9
SI ŠPORTNO DRUŠTVO BI NORDIC 1690663000 Vašca 7A, 4207 Cerklje
DK … EE … FI … FR … LT … NO … SK …
per_country: { AT: {in_register: 12, returned: 1}, CZ: {in_register: 65, returned: 1},
FI: {in_register: 3880, returned: 1}, … }That per_country field is deliberate. Some of these registers ignore their own limit
parameter, so the cap is enforced client-side — and the response tells you both what the
register matched and what you were handed, rather than quietly truncating. Where a source
publishes no count at all, in_register reads unknown rather than 0.
What is covered
Sixteen countries, every one free and keyless. ✔ means the register can be searched by
name; ✔ in the number column means eu_company_by_number works.
Country | Register | Identifier | Name | Number | Notes |
AT | Firmenbuch via JustizOnline | Firmenbuchnummer | ✔ | ✔ | Name, status and registered seat — no street address |
CH | Federal UID register (eCH-0108 SOAP) | UID (CHE) | ✔ | ✔ | Carries the CH.HR number and the MWST number |
CZ | ARES (Ministry of Finance) | IČO | ✔ | ✔ | Returns the VAT number too |
DK | CVR via cvrapi.dk | CVR | ✔ | — | Returns only the single best match |
EE | Ariregister (RIK) | Registrikood | ✔ | — | Name and number only, no address |
FI | PRH avoindata | Business ID | ✔ | — | Legal form in English, website |
FR | recherche-entreprises (INSEE/RNE) | SIREN | ✔ | — | Includes VAT number |
IE | CRO open data (CKAN) | CRO number | ✔ | ✔ | 822k companies, refreshed daily, CC-BY |
LT | Registrų centras JAR via get.data.gov.lt | Juridinio asmens kodas | ✔ | ✔ | Status from the deregistration date; addresses empty |
LV | Uzņēmumu reģistrs open data (CKAN) | Reģistrācijas numurs | ✔ | ✔ | CC0, daily; lists branches alongside companies |
MT | Malta Business Registry open API | MBR number | — | ✔ | By number only, e.g. |
NO | Brønnøysund Enhetsregisteret | Org.nr | ✔ | — | Flags bankruptcy and liquidation |
PL | VAT register (Ministry of Finance) | NIP / REGON | — | ✔ | By number only |
RO | ANAF | CUI | — | ✔ | By CUI only; carries the ONRC number. 1 req/s |
SI | AJPES PRS open data (CKAN) | Matična številka | ✔ | ✔ | No status column in the export, so |
SK | RPO (Statistical Office) | IČO | ✔ | — | Name and address history, current entry picked |
Four more countries, free, without a register
VIES was built to validate VAT numbers, but four member states release the registered name
and address through it. Where the national register is shut, vat_check is still a free
number-to-name look-up:
Country | Give it | Note |
PT | the NIPC | The NIPC is the VAT number, so this is a register look-up in all but name |
IT | the partita IVA | Registro Imprese itself is paid |
HR | the OIB | sudreg-api needs credentials you have to apply for |
SI | the davčna številka | Adds the address the AJPES export already gives |
eu_company_sources lists this as vies_number_to_name, and asking
eu_company_by_number for one of these countries says so in the refusal instead of
returning nothing.
What is not covered, and why
Every European country was probed. These have no free keyless register, and
eu_company_sources returns the list with a reason each, so an empty result is never read
as "no such company":
BE, BG, CY, DE, ES, GR, HR, HU, IS, IT, LU, NL, PT, SE, UK.
Five are worth knowing about specifically. UK Companies House is free but needs a
(free) API key — the single biggest win available for an afternoon's paperwork. GR and
HR likewise need an application. SE is paid and no Swedish API supports search by
name at any price. NL needs a paid subscription — see the nl_company_* tools if you
have one. IS has the data but its licence forbids passing it on, which is precisely
what this server does, so it is left alone.
BE, CY and the Swedish and Romanian name indexes exist only as bulk downloads, 22 MB to 690 MB. Ingesting those would make this a database rather than a live look-up, so it is deliberately out of scope: a server that answers from a four-week-old copy without saying so is the exact failure this project was built against.
Tool reference
tm_clearance
Param | Type | Default | Notes |
| string | required | The name to clear |
| int[] |
| Your classes — 9 is software, 42 is SaaS |
tm_search
Param | Type | Default | Notes |
| string | required | Substring search on the verbal element |
| string[] |
| Register codes, e.g. |
| boolean |
| Search every TMview register instead |
| boolean |
| Drop expired, refused, withdrawn, cancelled |
| int[] | — | Keep only marks touching these classes |
| int |
| Results are truncated, |
Exact name matches are flagged with exact_name and sorted to the top.
tm_detail
Param | Type | Default | Notes |
| string | required | EU application number, e.g. |
tm_offices
No parameters. Returns every register code with its name.
company_search
Param | Type | Default | Notes |
| string | required | Company name or part of it |
| string | — | ISO country code to narrow by, e.g. |
| int |
| Capped at 50 |
company_detail
Param | Type | Default | Notes |
| string | required | 20-character LEI, e.g. |
Returns the entity plus direct_parent, ultimate_parent and children. Only
relationships where both entities hold a LEI are visible.
vat_check
Param | Type | Default | Notes |
| string | required | With country code, e.g. |
| string | — | Country code, if it is not part of |
eu_company_search
Param | Type | Default | Notes |
| string | required | Company name or part of it |
| string | — | One ISO code. Omit to query all thirteen name-searchable registers at once |
| int |
| Per country, capped at 50. Enforced client-side — see |
Returns results (flat, one shape per row), per_country with in_register and
returned, registers_unreachable for any source that failed, and
skipped_no_name_search for a country you asked for that only supports look-up by number.
eu_company_by_number
Param | Type | Default | Notes |
| string | required | ISO code, e.g. |
| string | required | The national identifier. Non-digits are stripped where the register expects digits; Malta's space is inserted for you |
Returns result, plus also_under_this_number when a register holds more than one record
for the same identifier — a Swiss UID covers the enterprise and its establishments, and
dropping the extras silently would lose real information.
eu_company_sources
No parameters. Returns free_registers (16), no_free_api with a reason per country,
vies_number_to_name (4), and also_available.
nl_company_search (paid)
Param | Type | Default | Notes |
| string | — | Trade name or part of it |
| string | — | City |
| string | — | Postcode |
| string | — | Domain name, e.g. |
| string | — | KVK number, if you already have it |
| boolean |
| Exact rather than partial match |
| int |
| 20 results per page; the service caps totals at 500 |
At least one of name, kvk_number or domain is required.
nl_company_profile (paid)
Param | Type | Default | Notes |
| string | required | 8-digit KVK number |
| string | — | For one specific establishment |
nl_company_vat / nl_company_tree (paid)
Param | Type | Default | Notes |
| string | required | 8-digit KVK number |
Country codes are validated before the call, so a typo fails locally instead of returning a
meaningless invalid. Greece is accepted as either GR or EL.
How it works
Public endpoints, no authentication on any of them:
TMview (
tmdn.org) — the shared search service of EUIPO and the national offices. Covers EU, Benelux, all EU member states, EFTA, WIPO international registrations and a long tail beyond Europe. Paged 100 records at a time, up to 10 pages per query.EUIPO eSearch (
euipo.europa.eu/copla) — the same case-file data the public eSearch UI renders, including goods-and-services text and the opposition history.GLEIF (
api.gleif.org) — the official LEI register. Company identity, national registration numbers, and the parent/child relationships that make up a group.EU VIES (
ec.europa.eu/taxation_customs/vies) — VAT number validation, returning the name and address on file with the national tax authority.Sixteen national company registers — AT, CH, CZ, DK, EE, FI, FR, IE, LT, LV, MT, NO, PL, RO, SI and SK, each queried at its own source and normalised into one shape. Field names are aligned; source coverage is not, so each row names the register it came from. Three of them (IE, LV, SI) are CKAN datastores and share one client; Switzerland speaks doc-literal SOAP and is reached with a hand-built envelope, like Company.info.
One optional paid source, used only if you configure it:
Company.info / Webservices.nl (
ws1.webservices.nl) — the Dutch Handelsregister over SOAP. Reached with a hand-built envelope and a small XML parser, so the server keeps its zero-dependency promise.
Three decisions shape every answer:
Live vs dead. A right only counts if its status is one of Registered, Filed, Application published, Application accepted, Opposition period, Expiring, Registration pending. Everything else — Ended, Expired, Withdrawn, Refused, Cancelled — blocks nothing, so it is reported separately rather than silently dropped.
Exact vs similar. Names are compared with case, spaces and punctuation removed, so
NorthWind,NORTHWINDandnorth-windare one name. Everything else that came back is a look-alike, and only matters where the classes overlap.Failures stay loud. Each request retries three times with backoff; if a source is unreachable the tool returns an explicit error. It never converts a failed lookup into an empty result set.
Every response names the source it came from in a source field.
Nice classes worth knowing
Class | Covers |
9 | Software, downloadable programs, apps |
35 | Advertising, business administration, data processing |
36 | Insurance, financial services |
37 | Vehicle maintenance and repair |
38 | Telecommunications, network access |
39 | Transport, fleet logistics |
42 | SaaS, software development, IT services |
For most software products, clearing 9 and 42 is the minimum — hence the default.
Limits and caveats
This is register data, not legal advice. It tells you what is on file. Whether a mark is infringed, or a name registrable, is a call for a trademark attorney.
Registers lag. TMview statuses trail the source registers. Confirm any live right that matters with
tm_detail, which reads EUIPO directly.Unregistered rights are invisible here. In the Netherlands a trade name right arises from use alone (handelsnaamrecht), with no registration to find. An empty result is not proof a name is unused.
tm_detailis EU-only. National case files are not exposed through this endpoint.Company coverage is uneven. GLEIF only holds entities with a LEI, so many SMEs are missing entirely, and a
LAPSEDLEI status means the identifier was not renewed — the company itself may well still trade. VIES needs the VAT number up front. Neither replaces a national company register.Responses use one flat, normalised shape across every source. Every record names the register it came from in a
sourcefield.The endpoints are public but undocumented. They power the TMview and eSearch web UIs. They are free and need no key, and they can change without notice. Be considerate with request volume.
Patents are out of scope. Trademarks only.
The paid tools cost money per call. Each
nl_company_*invocation is a billed query. They are deliberately separate tools rather than one fat call, so every charge is a decision you made.National registers differ in freshness and depth. The fields are normalised, the coverage is not. Estonia returns no address, Denmark returns one match rather than a list, Austria gives the registered seat but no street, Lithuania's address columns are empty, and Slovenia's export has no status column at all — so Slovenian rows report
status: nullrather than assume "active". Each register updates on its own schedule. A hit in one country says nothing about another.Two of the sources are not documented APIs. Austria's JustizOnline endpoint is the courts' own application backend, and Malta's registry sits behind a WAF that rejects unrecognised
User-Agentstrings and throttles bursts. Both work today; treat both as liable to change, and keep request volume low.Some status codes are reported raw rather than guessed at. Switzerland's eCH-0108 status has seven values; only 3 (active) and 5 (ended) are confirmed against live records, so anything else comes back as
eCH-0108 code N. Inventing a label would be worse than saying you do not know.
Development
npm run smoke # 24 checks over stdio against the live registers
node --check src/index.jsThe whole server is one dependency-free file, src/index.js: an HTTP helper with retries,
one function per tool, the JSON-RPC tool schemas, and a line-buffered stdio loop. Requests
are handled concurrently and the process stays alive until every in-flight call has
answered.
License
MIT — see LICENSE.
Available Tools
14 toolscompany_detailA
Full GLEIF record for a LEI, including group structure: direct parent, ultimate parent and subsidiaries.
| Name | Required | Description | Default |
|---|---|---|---|
| lei | Yes | 20-character LEI, e.g. 5493005XXPWUMR2E5305 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It adds meaningful behavioral context by promising a 'full GLEIF record' and enumerating the group-structure fields returned. It does not discuss failure modes or data freshness, but for a simple get-by-identifier tool this is reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, information-dense sentence with no filler. The main purpose is front-loaded, and the group-structure detail is appended efficiently. Every word adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with one required parameter, no output schema, and no annotations, the description is mostly complete: it states the input and the key contents of the output. It could be even more complete by mentioning whether invalid LEIs return an error or null, but this is not critical for selecting and invoking the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully documents the single 'lei' parameter with an example and format, giving 100% schema coverage. The description does not add any parameter-level semantics beyond what the schema already provides, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource (a LEI), the action (returning the full GLEIF record), and the specific scope (including direct parent, ultimate parent, and subsidiaries). This is precise and naturally distinguishes the tool from search-oriented siblings like company_search or nl_company_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: when you have a LEI and need the full GLEIF record. However, it does not explicitly state when not to use it, nor does it compare itself to sibling tools such as company_search or eu_company_search, so the agent must infer the boundary from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
company_searchA
Find a company by name in GLEIF: legal form, status, address, national registration number and LEI. Useful for identifying a trademark holder. Covers only entities that hold a LEI — many SMEs do not.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Company name or part of it | |
| country | No | ISO country code to narrow by, e.g. "DE" or "NL" | |
| max_results | No | Defaults to 10, capped at 50 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral transparency burden and does so well: it discloses the source (GLEIF), the coverage scope (LEI holders only), and the returned data categories. It does not mention matching behavior or rate limits, but the most decision-relevant limitation is clearly disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three focused sentences with no filler: purpose and returned fields, use case, and critical limitation. Each sentence earns its place without repeating schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter search tool with no annotations and no output schema, this is largely complete: it names the fields returned and the main exclusion. It could add partial-match behavior or the possibility of multiple matches, but those are inferable from the schema and the search semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the description does not need to re-explain parameters. It reinforces that `name` is the search key, but it adds no parameter-level detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb (Find), the resource (a company by name in GLEIF), and the data fields returned, including legal form, status, address, national registration number, and LEI. The LEI-scope caveat also helps distinguish it from sibling company-registry tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a concrete use case (identifying a trademark holder) and an explicit limitation (only entities that hold a LEI, many SMEs excluded), so an agent knows when not to rely on it. It does not name a specific sibling tool as a fallback, which would make routing fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eu_company_by_numberA
Look a company up by its national registration number. Czechia by ICO, Poland by NIP or REGON — for Poland this is the only route, since it offers no name search.
| Name | Required | Description | Default |
|---|---|---|---|
| number | Yes | National registration number | |
| country | Yes | ISO country code, e.g. "CZ" or "PL" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It accurately conveys a read-only lookup action and clarifies supported countries and identifier types. However, it does not describe return behavior, error cases, or whether both Polish number formats are accepted interchangeably.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler, and the primary action is front-loaded. The only minor flaw is the slightly ambiguous pronoun 'it' in the second sentence, but the meaning is recoverable from context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter lookup, the description provides enough context to invoke the tool correctly, including country-specific number types and a routing hint for Poland. It omits return-format details, but there is no output schema and the core usage is well covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful context beyond the schema by explaining that 'number' means ICO in Czechia and NIP/REGON in Poland, and by giving concrete ISO examples for 'country'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Look a company up') and resource ('national registration number'), and clarifies the exact number types per country (ICO, NIP, REGON). It also differentiates from name-based search by noting that for Poland this is the only route.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when to use the tool: when a national registration number is available, and specifically for Poland since name search is not an option. It does not explicitly name the alternative tool for name-based lookup, but the guidance is strong enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eu_company_searchA
Search the national company registers of Czechia, Slovakia, Finland, France, Norway, Denmark and Estonia by name. Free, no API key. Omit country to search all seven at once.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Company name or part of it | |
| country | No | ISO country code, e.g. "CZ". Omit to search every register | |
| max_results | No | Per country, defaults to 10, capped at 50 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and provides useful behavioral facts: the service is free, requires no API key, and a single call can span all seven registers. But it does not disclose result shape, ordering, rate limits, or error behavior, leaving meaningful gaps for an agent invoking without an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences deliver the core action, target regions, the required parameter, cost/auth characteristics, and the key optional-country behavior. There is no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity read-only search tool with fully documented parameters, this description covers the essential selection and invocation context: target countries, name matching, optional country, and auth requirements. The lack of an output schema and explicit sibling differentiation prevents it from being fully complete, but those are minor gaps here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already describes name, country, and max_results clearly. The description mainly restates that lookup is by name and that country can be omitted, so it adds little beyond the structured parameter definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and object — 'Search the national company registers' — and immediately scopes it to seven named countries and by-name lookup. This clearly distinguishes it from the sibling eu_company_by_number and narrower nl_company_search tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context: use this when searching company registers by name in the listed countries, and explicitly explains that omitting country searches all seven. It does not, however, name alternatives or state when not to use it, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eu_company_sourcesA
Which countries have a free register, which identifier each uses, and which countries have none — with the reason. Read this before reading an empty result as "does not exist".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It discloses the tool's domain and its interpretive role. Since this is a zero-parameter read-only reference, there are no side effects or auth requirements to document. It does not state the output shape, but the content categories are described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The primary content is front-loaded and the usage warning earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter reference tool, the description covers the key information: what it lists and why it matters. It lacks an explicit statement of return/table format, but the output is intuitive and the usage guidance is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, so the baseline of 4 applies. The description adds meaning to what the tool returns rather than parameter syntax; nothing else is needed here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly defines the tool's content: it lists countries with free registers, their identifiers, and countries without one, including reasons. This distinguishes it from the search-oriented sibling tools, though it lacks a direct verb phrase and does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The final sentence gives explicit context: consult this tool before interpreting an empty result as proof of nonexistence. This is strong when-to-use guidance, but the description does not explicitly compare against sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nl_company_profileA
Full Handelsregister profile for a KVK number: legal name, all trade names, legal form, RSIN and addresses. For trademark work the trade names are the most important field. PAID.
| Name | Required | Description | Default |
|---|---|---|---|
| kvk_number | Yes | 8-digit KVK number | |
| establishment_number | No | Optional, for one specific establishment |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral disclosure burden. It reveals the paid nature ('PAID') and lists the returned profile contents, implying a safe read-only lookup. It does not mention error behavior or output format, but for a non-mutating data fetch the core behavior is reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences pack the core function, the key field for trademark work, and the cost flag with no waste. The most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only lookup with two parameters and no output schema, the description covers the return content and the paid cost. It omits guidance on when to combine it with trademark tools, but that is more a usage-guidance gap than missing operational information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% because both parameters have descriptions. The tool description adds little beyond restating that the profile is keyed by KVK number and does not elaborate on establishment_number. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly indicates the tool returns a full Handelsregister profile for a KVK number and enumerates the fields (legal name, trade names, legal form, RSIN, addresses). This distinguishes it from sibling tools like nl_company_search or nl_company_tree.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'For trademark work the trade names are the most important field' provides an implied use case but does not explicitly guide selection among alternatives such as tm_search or nl_company_search. No exclusions or 'when not to use' guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nl_company_searchA
Find a Dutch company in the Handelsregister by trade name, city, postal code or domain, and get its KVK number back. Covers the SMEs that GLEIF misses. PAID: requires Company.info credentials in the environment.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | ||
| name | No | Trade name or part of it | |
| page | No | Defaults to 1; 20 results per page | |
| domain | No | Domain name, e.g. example.nl | |
| strict | No | Exact rather than partial match | |
| kvk_number | No | KVK number, if you already have it | |
| postal_code | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description has to carry the behavioral disclosure burden. It does disclose the paid/auth requirement and that a KVK number is returned, but it does not mention pagination, exact vs partial matching, no-result behavior, or whether this is a read-only search, so the behavioral profile is incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no fluff: action and result first, GLEIF differentiator second, auth caveat third. Key information is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with no annotations and no output schema, the description gives the core search intent and a credentials note, but leaves out practical invocation behavior such as pagination/result shape, handling of multiple or no matches, and how the kvk_number parameter fits. It is adequate for a first pass but not complete for fully reliable invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is moderate at 71%. The description adds plain-language meaning by listing trade name, city, postal code, and domain as search keys and clarifying the output. It doesn't mention that kvk_number can be used as an input, nor the paging/strict fields, though those are partially documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific action ('Find'), a specific resource ('Dutch company in the Handelsregister'), the supported lookup keys (trade name, city, postal code, domain), and the expected output (KVK number). It also differentiates itself from GLEIF-based lookups by noting it covers SMEs that GLEIF misses.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear usage context: use this when you need a KVK number for a Dutch SME via Handelsregister fields, and it calls out the paid credential prerequisite. The GLEIF sentence is a weak alternative signal, but it does not explicitly name sibling tools or state when not to use this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nl_company_treeA
Group structure for a KVK number: parents, subsidiaries and UBO as a tree. Where GLEIF stops because an entity holds no LEI, this keeps going. NOTE: contains personal data. PAID.
| Name | Required | Description | Default |
|---|---|---|---|
| kvk_number | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does a decent job: it discloses that the output is a tree, that it extends beyond GLEIF/LEI coverage, that it contains personal data, and that it is a paid tool. It could add more detail about data sensitivity handling or response characteristics, but the key behavioral caveats are present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The main purpose is front-loaded, followed by the coverage boundary and critical caveats about personal data and cost. Every clause contributes meaningful guidance for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-style tool with no output schema, the description explains the return shape (tree of parents, subsidiaries, UBO) and critical constraints (personal data, paid, LEI gap-filling). It is slightly incomplete around input format details and explicit sibling routing, but it is largely sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description should compensate, but it only restates that the input is a KVK number without specifying format, validation, or accepted variations. The single parameter name already communicates 'kvk_number', so the description adds little beyond what the schema shows.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's output: a group structure tree containing parents, subsidiaries, and UBOs for a KVK number. It is specific about the resource and content, but it does not explicitly differentiate from sibling tools like nl_company_profile or nl_company_search, though the tree/group-structure focus makes it fairly distinguishable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a clear usage context: use this when GLEIF would stop due to missing LEI, since this tool continues the hierarchy. It names GLEIF as an alternative and gives an implied condition for selection, but it does not explicitly mention when-not-to-use relative to sibling tools or provide exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nl_company_vatA
VAT number for a KVK number. Combine with vat_check to confirm the name for free via EU VIES. PAID.
| Name | Required | Description | Default |
|---|---|---|---|
| kvk_number | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it discloses one important operational trait: the call is PAID. It also points to a free confirmation path. However, it does not mention failure behavior, response shape, or whether any restrictions apply, so transparency beyond purpose is limited.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short fragments communicate purpose, workflow, and cost without redundancy. The key fact, VAT number from a KVK number, is front-loaded; every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple enough that a one-line purpose plus cost and follow-up advice largely suffices. The absence of an output schema is mitigated because the description explicitly says the output is the VAT number; it could still use input-format examples or error behavior, but nothing critical blocks correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema gives kvk_number with no description, so the name is self-explanatory and the description reinforces that it is a KVK number by saying 'VAT number for a KVK number.' It does not add a format, example, or transform guidance, leaving the agent to infer the expected value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific purpose: returning a VAT number for a given KVK number. It is clear enough to separate this from the listed company-search and EU lookup siblings, though it does not use a strong verb like 'retrieve' and does not explicitly contrast it with similar Dutch company tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit workflow: combine this tool's result with vat_check to confirm the name for free via EU VIES. It does not explicitly state when not to use it or name other alternatives, but the complementary relationship to vat_check is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_clearanceA
Clearance check on a name in the EU and Benelux registers. Returns a verdict plus three lists: identical live marks, identical expired marks, and live similar rights in your Nice classes. Start here.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name to clear | |
| nice_classes | No | Your classes; defaults to [9, 42] (software and SaaS) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of explaining behavior. It is transparent about the output shape: 'a verdict plus three lists: identical live marks, identical expired marks, and live similar rights in your Nice classes.' It clearly implies a read-only check, though it does not disclose failure modes or edge-case behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The purpose is front-loaded, the return payload is described precisely, and the usage cue 'Start here' is minimal and effective. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description covers the return structure with the verdict and the three lists. Parameter semantics are sufficiently covered by the 100% schema description. Minor omissions like error handling or what 'verdict' contains prevent a perfect score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameters are already documented. The description adds some context by tying 'name' to EU/Benelux registers and 'Nice classes' to the similarity lists, which is useful but not extensive. It stays at the baseline because it does not add significant new parameter-level detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies a specific operation: 'Clearance check on a name in the EU and Benelux registers' and specifies the output components. It doesn't explicitly compare against sibling tools, but 'Start here' positions it as the entry point, making its purpose distinctive enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Start here' gives implied usage guidance: this is meant to be the initial clearance step. However, it does not name alternatives, state when not to use this tool, or explain how it relates to other search or watch tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_detailA
Full EUIPO case file for an EU application number: status, dates, validity, renewals, holder, oppositions and the complete goods-and-services text per class. EU marks only.
| Name | Required | Description | Default |
|---|---|---|---|
| number | Yes | EU application number, e.g. 000039800 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of disclosure. It does enumerate the main data categories returned (status, dates, validity, renewals, holder, oppositions, goods/services), which is useful, but it does not mention limitations such as data freshness, availability, or that the result is based on exact application number matching. There is no contradiction with annotations because none exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, information-dense sentence that front-loads the core purpose ('Full EUIPO case file for an EU application number') before listing the included contents. Every phrase earns its place, and there is no redundant or vague filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter lookup tool, the description lists the key return contents and the geographic scope, which is adequate for basic invocation. However, since there is no output schema, the description does not fully communicate the response structure or potential edge cases, and it leaves the relationship to sibling search/clearance tools implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter is already well-documented with an example. The tool description reinforces that the parameter is an EU application number and that the tool is EU-only, but it adds no new formatting, validation, or domain details beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the resource (full EUIPO case file) and scope (EU marks only) and enumerates the contained data fields, making it easy to distinguish from siblings like tm_search or tm_clearance. However, the verb is implicit rather than explicit ('Full... case file' implies retrieval) and it does not name any sibling directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied: when you need a comprehensive EUIPO case file by application number, use this tool. Yet it provides no explicit guidance on when not to use it, no alternative tool names, and no boundary with tm_search or tm_clearance beyond the 'EU marks only' scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_officesA
List the available trademark registers and their codes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It clearly indicates a read-only listing operation and specifies the return content (registers and codes), but it does not disclose output format, ordering, completeness guarantees, or any potential edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every word contributes meaning, and it is perfectly sized for a zero-parameter listing tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, parameterless list tool, the description adequately states what the tool returns. However, it could be slightly more complete by hinting at how the register codes are intended to be used with sibling trademark tools, and it omits any output format details since there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the schema already fully covers the input side. The description does not need to add parameter-level meaning, and the baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') with a clear resource ('available trademark registers and their codes'). This makes its reference/list nature immediately distinct from sibling tools like tm_search, tm_detail, and tm_clearance, which are query-oriented.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is given about when to use this tool versus alternatives. It does not mention that it should be used before search/detail calls to obtain register codes, nor does it state any conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tm_searchA
Search trademarks in TMview. Defaults to EU + Benelux and live rights only. Set worldwide=true to search every national register.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Substring search on the verbal element | |
| offices | No | Register codes, e.g. ["EM","BX","DE"]. Defaults to EU + Benelux. | |
| live_only | No | Defaults to true | |
| worldwide | No | Search every TMview register | |
| max_results | No | ||
| nice_classes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the burden of behavioral disclosure. It adds useful behavioral context by explaining default jurisdictions and the effect of worldwide=true, but it does not disclose result format, pagination, limits, or whether the operation has any side effects beyond being a search.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The core purpose is front-loaded, and the key behavioral override is stated immediately after the default behavior, making the description easy to scan and digest.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a basic call, the description is sufficient: it tells the agent what the tool searches, the defaults, and how to broaden to worldwide. But with no output schema and no explanation of max_results or nice_classes, an agent may still be unsure about expected responses or how to constrain results beyond the core query.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, so the description does not need to document everything, but it adds value beyond the schema by clarifying defaults for offices and live_only and by describing the effect of worldwide=true. However, max_results and nice_classes still lack semantic guidance in both the schema and the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Search trademarks in TMview') and states useful default scoping. However, it does not explicitly differentiate tm_search from the sibling tm_clearance, which is likely a related but distinct trademark search, so it misses full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: it searches TMview, defaults to EU + Benelux and live rights, and supports a worldwide mode. It does not say when to prefer tm_search over tm_clearance or other sibling tools, so usage guidance is mostly implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vat_checkA
Verify an EU VAT number against VIES and get the officially registered name and address back. Confirms a company exists and is active. Cannot be searched by name — you need the number.
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | Country code, if not part of vat_number | |
| vat_number | Yes | With country code, e.g. NL123456789B01 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses that the tool performs a VIES lookup, returns official registration data, and confirms existence/active status. It does not mention potential external-service availability issues, invalid-number errors, or that this is a read-only operation, though the verb 'Verify' strongly implies it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place. The core action and result are front-loaded, and the constraint is stated at the end without repetition or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description reasonably explains the return value (official name and address), the verification semantics, and the prerequisite input. It could go further on error cases or the optional country parameter, but the schema already covers the parameters and the core behavior is adequately specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds the general constraint that a number is required and name search is impossible, but it does not add detail about the optional country parameter or the expected combined format beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Verify') and resource ('EU VAT number against VIES'), and clearly says what is returned: officially registered name and address. It also differentiates from siblings by emphasizing this is a number-based verification, not a search tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear usage context: the tool requires a VAT number and cannot be used to search by name. It does not explicitly name sibling alternatives like eu_company_search, but the 'cannot be searched by name' constraint is a practical when-not that helps an agent select this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
14 tool updates
v1.6.1- First observed
company_detail - First observed
company_search - First observed
eu_company_by_number - First observed
eu_company_search - First observed
eu_company_sources - First observed
nl_company_profile - First observed
nl_company_search - First observed
nl_company_tree - First observed
nl_company_vat - First observed
tm_clearance - First observed
tm_detail - First observed
tm_offices - First observed
tm_search - First observed
vat_check
TDQS
The set is mostly distinct, with clear prefix families for trademarks and company data. Minor overlap exists between tm_clearance and tm_search, and between the various company search tools, but the descriptions clearly delineate source coverage and purpose.
Naming is generally consistent with family prefixes like tm_, eu_company_, and nl_company_, and descriptive suffixes like _search, _detail, and _profile. The main deviation is vat_check, which uses a verb_noun pattern rather than a prefix family.
Fourteen tools is well-scoped for a server combining trademark research and company verification. Each tool has a distinct role, and the count is within the ideal range without feeling padded or sparse.
The tool surface covers trademark search, clearance, details, and office listings, plus company search, verification, VAT checks, and group structures. Minor gaps include limited national register coverage and no direct trademark-to-holder workflow, but the included sources tool helps mitigate empty results.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Trademark search, monitoring and conflict research across 30+ registers, with provenance.
Free brand-name Clearance Checks from live registries; connect a plan (API key) for full checks.
Trademark clearance (USPTO+TMview) and self-graded stock signals for AI agents. JSON verdicts.
Company, KYB, VAT, sanctions, LEI and address data for 15 EU countries.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for EU company and business data. 9 tools: company search (GLEIF, 2M+ entities), LEI lookup, corporate structures (parent/subsidiaries), trade register search, EU VAT validation (VIES), GDP, unemployment, inflation, and business demography (Eurostat). All APIs free, no keys required.94MIT
- AlicenseAqualityCmaintenanceStructured business intelligence for AI agents. 5.5M verified entities across 34 countries, 40.3M BORME mercantile acts, EU VAT validation, GLEIF, healthcare registries. 20 tools.61MIT
- FlicenseNot gradedqualityBmaintenanceEnables querying French business registers (RNE, BODACC) and trademarks via INPI APIs. Provides tools to search companies, retrieve legal status, directors, beneficial owners, collective procedures, and trademark details.-
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to access official European business data across 15 EU countries, including company lookups, VAT validation, sanctions screening, and KYB reports.11,5021MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/AI-AlexBaum/IP-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server