ENTIA Entity Verification MCP
Server Details
Spain's deepest business intelligence for AI agents. Verify companies via BORME, VIES, GLEIF and Wikidata. Access 52M+ records across 34 countries: entity lookup, VAT validation, BORME filings, zone economic profiles, and competitor search.
- Status
- Healthy
- Uptime
- 100.0% over 63 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2024-11-05
- URL
TDQS
Scored across 12 tools
Several tools return overlapping entity information: entity_lookup (with dossier preview), search_entities, and get_full_dossier all surface entity data, while get_entia_home and get_entity_home_projection both retrieve facets of the same Entia Home ('same truth'). The detailed descriptions do help distinguish identifier-based lookup from keyword search and from aggregation, but the boundaries remain fuzzy enough to invite misselection.
Most names follow a readable verb_noun pattern (get_competitors, get_full_dossier, verify_vat, search_entities, run_risk_audit, entity_lookup, professional_lookup). A few (zone_profile, get_showcase) deviate slightly by dropping or varying the verb, but the overall convention is consistent and predictable.
12 tools is well within the ideal 3-15 range for an entity-verification platform. Each tool maps to a distinct capability (lookup, search, dossier, VAT, professionals, zone, competitors, risk audit, stats), so the count is well-scoped rather than padded.
The surface covers the domain broadly: identity lookup, broad search, competitor discovery, aggregated dossier, VAT validation, professional verification, zone socioeconomics, and digital risk audit — a strong lifecycle for verification/KYB. Minor gaps remain (no batch/bulk lookup, limited historical or financial-filing operations), but core workflows are complete.
Available Tools
12 toolsentity_lookupEntity LookupARead-onlyIdempotentInspect
Look up any business entity by name, CIF/NIF, EU VAT, or LEI. Free callers receive a trace-level identity preview; authenticated callers receive the full paid dossier.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Company name, CIF/NIF (B82846825), EU VAT (ESB82846825), or LEI (20 chars) | |
| name | No | Alias for `q` — accepted for compatibility with clients that send `name`. | |
| query | No | Alias for `q` — accepted for compatibility with clients that send `query`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| _meta | No | |
| found | No | True only when an identity anchor corroborated the query |
| query | No | |
| entity | No | Verified identity: legal name, tax id, address, sector |
| integrity | No | Tamper-evidence MAC. Not an electronic signature |
| error_code | No | |
| provenance | No | Publisher and data sources of this answer |
| data_coverage | No | Which sources answered and which did not |
| registry_data | No | Official registry payload (BORME/GLEIF/VIES/native) |
| coherence_errors | No | |
| economic_profile | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is read-only, idempotent, and non-destructive, so the description only needs to add context beyond that. It does so by disclosing an auth-dependent output split: free callers get a trace-level preview, while authenticated callers get the full paid dossier. This is useful behavioral context that annotations do not capture.
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 first states the core purpose and accepted identifiers, and the second adds the key access-level behavior. Every sentence earns its place, and 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 read-only lookup with three optional parameters and an existing output schema, the description covers the essential context: what can be looked up and what different callers receive. It does not specify behavior when no query parameter is supplied, but the output schema and annotations reduce the impact of that gap.
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%; q, name, and query are each documented in the schema, including alias relationships. The description adds no parameter-level detail beyond what the schema already provides, so it stays at the baseline for high schema coverage.
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 names a specific verb ('look up'), a resource ('business entity'), and the accepted identifier types (name, CIF/NIF, EU VAT, LEI). It is immediately clear what the tool does, though it does not explicitly differentiate itself from siblings like search_entities or get_full_dossier.
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 identifier list and 'look up any business entity' imply when the tool should be used, but the description gives no explicit guidance about alternatives or exclusions. With sibling tools such as verify_vat, search_entities, and get_full_dossier, the routing decision is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_competitorsGet CompetitorsARead-onlyIdempotentInspect
Find real competitors in the same sector and city. Ranked entities with identity + location + sector matching. Spain only on the public surface. sector is a closed vocabulary — see the enum; aliases such as abogados (the slug ENTIA uses in its own Entia Home URLs) resolve to their canonical slug.
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | City name in Spain (Madrid, Barcelona, Valencia, Sevilla, Bilbao) | |
| limit | No | Max results (1-30) | |
| sector | Yes | ENTIA sector slug. Canonical: dental, legal, estetica, psicologia, medicos, talleres, veterinarios, reformas, inmobiliarias, asesorias, gimnasios… Aliases (abogados, salud, dentist, beautysalon…) resolve to a canonical slug and the response declares the translation in _meta.sector_resolved_from. |
Output Schema
| Name | Required | Description |
|---|---|---|
| city | No | |
| _meta | No | Carries sector_resolved_from / sector_resolved_to |
| count | No | |
| sector | No | Canonical slug actually used after alias resolution |
| country | No | |
| competitors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate the tool is read-only, open-world, idempotent, and nondestructive. The description adds behavioral insight by explaining how sector aliases are resolved (e.g., `abogados` resolves to canonical slug) and that the response includes `_meta.sector_resolved_from`. This goes beyond annotations, though it does not detail rate limits or potential response variability.
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 concise (3 sentences) and front-loaded with the core purpose. The additional detail about sector vocabulary is placed naturally, but the last sentence could be slightly more streamlined to avoid over-explaining the alias resolution, though it remains valuable.
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 the tool has an output schema and clear annotations, the description covers the key aspects: purpose, sector vocabulary behavior, and geographic scope. It does not address pagination or ordering of results, which could be inferred from the `limit` parameter. For a ranking tool with clear constraints, this is nearly complete but missing an explicit statement about result ordering (e.g., by relevance).
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%, but the description adds significant value beyond the schema by explaining that `sector` is a closed vocabulary with aliases that resolve to canonical slugs, and that the response will indicate the resolution. It also clarifies that `city` is limited to Spanish cities, reinforcing the geographic constraint. This rich semantic guidance helps the agent avoid errors with non-canonical values.
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 tool's purpose: 'Find real competitors in the same sector and city.' It specifies the criteria (identity, location, sector matching) and geographic scope (Spain only), which distinguishes it from siblings like `search_entities` or `entity_lookup` that likely have broader or different search capabilities.
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 provides clear usage guidance by specifying the geographic constraint ('Spain only on the public surface') and noting that the `sector` parameter uses a closed vocabulary with aliases. However, it does not explicitly mention when not to use this tool (e.g., for non-Spain competitors or non-public data) or compare it directly to sibling tools, though the sibling context suggests differentiation from `search_entities`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_entia_homeGet Entia HomeARead-onlyIdempotentInspect
Retrieve the Schema.org JSON-LD @graph for a specific entity's Entia Home (machine layer at /v1/identity/{country}/{sector}/{city}/{slug}.jsonld). Requires country, sector, city, slug path segments — not cif/q. Obtain the path via entity_lookup / showcase (canonical_url). Fail-closed: never returns ENTIA corporate marketing as if it were the entity.
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | City slug (madrid, barcelona, london) | |
| slug | Yes | Business slug (clinica-dental-sonrisa) | |
| sector | Yes | Industry slug (dental, legal, talleres, …) | |
| country | Yes | ISO 3166-1 alpha-2 (es, gb, fr) |
Output Schema
| Name | Required | Description |
|---|---|---|
| _meta | No | |
| @graph | No | WebPage, Entity, Verification Report and Territorial Profile nodes |
| @context | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false. The description adds critical context beyond annotations: it reveals the machine-layer URL structure, the exact data format (JSON-LD @graph), and the 'fail-closed' behavior that prevents confusion with corporate marketing. This is precisely the kind of behavioral detail annotations alone cannot provide.
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 extremely dense and front-loaded: two sentences with zero waste. The first sentence identifies the exact action, resource, and URL pattern. The second sentence provides critical usage guidance (path sourcing) and behavioral guarantee (fail-closed). Every clause serves a distinct purpose.
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 the existence of an output schema (covering return values), a clear input schema (100% coverage), and strong annotations, the description is complete for an agent: it explains what the tool retrieves, how to get the right path, and what failure behavior to expect. A 5 would require mentioning a prerequisite (e.g., 'entity_lookup must be called first to obtain the canonical_url') or potential error cases.
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% with each parameter having a description and regex pattern. The description reinforces the path-segment nature of the parameters ('country, sector, city, slug path segments') but adds no new constraints or semantics beyond what the schema already provides. A 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 uses specific verbs ('Retrieve the Schema.org JSON-LD @graph') and names the exact resource ('Entia Home (machine layer at /v1/identity/{country}/{sector}/{city}/{slug}.jsonld)'). It clearly distinguishes itself from siblings like 'get_showcase' and 'entity_lookup' by detailing the path structure and data format.
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 explicitly states that the path must come from 'entity_lookup / showcase (canonical_url)' and clearly excludes using 'cif/q'. It does not, however, explicitly state when NOT to use this tool compared to siblings like 'get_entity_home_projection' or 'get_full_dossier', which would elevate it to a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_entity_home_projectionGet Entity Home Projection v1BRead-onlyIdempotentInspect
Read the materializer snapshot entia.entity_home_projection.v1 for an Entia Home (claims + projection + policy). Same truth as the public ficha HTML/JSON-LD twin. Serve from R2 sibling .projection.v1.json — no ad-hoc MCP enrichment.
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | City slug (madrid, barcelona) | |
| slug | Yes | Business slug (clinica-dental-ceodent) | |
| sector | Yes | Industry slug (dental, legal, …) | |
| country | Yes | ISO 3166-1 alpha-2 (es, gb, fr) | |
| include_render_context | No | If true, keep render_context (large). Default strips it for agents. |
Output Schema
| Name | Required | Description |
|---|---|---|
| gate | No | PUBLISH / PARTIAL / HOLD / REGISTRY_ONLY |
| _meta | No | |
| claims | No | |
| policy | No | |
| schema | No | |
| subject | No | |
| projection | No | |
| generated_at | No | |
| corroboration | No | |
| materializer_version | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent and non-destructive semantics, so the bar is lower, yet the description still adds provenance the agent needs: the data is a materializer snapshot served verbatim from a stored object with no server-side enrichment. That tells the agent the result is canonical but not freshly computed. It stops short of stating staleness windows or refresh 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 tight sentences, no padding, with the core action front-loaded. The middle sentence about R2 sibling objects is implementation detail that helps less than the space it occupies, but nothing is redundant or bloated.
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?
With an output schema, full parameter coverage and annotations, the safety and return-shape burdens are already carried elsewhere, and provenance is covered. The remaining gap is tool selection: a sibling named get_entia_home exists and the description never says how these differ, which is the one thing an agent cannot infer from structured fields.
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%: country, sector, city and slug all carry format/slug examples, and include_render_context documents its own default and the stripping behavior. The description adds nothing beyond the schema, so the baseline 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 verb ('Read') and resource ('materializer snapshot entia.entity_home_projection.v1 for an Entia Home') are specific, and 'claims + projection + policy' clarifies the payload. However, it never distinguishes itself from the near-named sibling get_entia_home, leaving real ambiguity about which home-fetching tool to pick.
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?
There is no explicit when-to-use or when-not guidance, and no alternative (e.g. get_entia_home, entity_lookup) is named. The only implied routing cue is 'Same truth as the public ficha HTML/JSON-LD twin — no ad-hoc MCP enrichment,' which hints at canon rather than telling the agent when this is the right call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_full_dossierGet Full DossierARead-onlyIdempotentInspect
Aggregator — 90+ fields about an entity in one call. Combines 4 ENTIA sources in parallel: identity, zone, BORME, VIES. Killer tool for due diligence/KYB.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Company name, CIF/NIF, EU VAT, or LEI |
Output Schema
| Name | Required | Description |
|---|---|---|
| _meta | No | |
| found | No | |
| query | No | |
| entity | No | |
| integrity | No | |
| provenance | No | |
| trust_score | No | |
| verification | No | |
| data_coverage | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior. The description adds useful behavioral context beyond annotations: it is an 'Aggregator' that combines four sources 'in parallel' and returns a large field set, which informs expectations about scope and data provenance.
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 exceptionally compact: scope ('90+ fields in one call'), mechanics ('4 ENTIA sources in parallel'), and use case ('due diligence/KYB') each get a short, meaningful clause. There is no wasted text, and the key aggregation fact 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?
With a read-only, idempotent annotation profile, a single well-documented parameter, and an output schema present, the description does not need to explain return values. It provides the essential behavioral identity, source composition, and intended use, leaving no significant gap for an agent deciding to invoke it.
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%: the single 'query' parameter already documents accepted formats ('Company name, CIF/NIF, EU VAT, or LEI'). The description adds no additional parameter-level meaning beyond referring to the target as an entity, so the baseline 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 tool as an aggregator returning '90+ fields about an entity in one call' and names the four combined sources. It conveys a broad entity dossier concept but does not explicitly contrast it with sibling lookup tools like entity_lookup or search_entities.
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 states a target use case ('Killer tool for due diligence/KYB'), indicating when an agent would want comprehensive entity intelligence. However, it does not provide explicit when-to-use vs alternatives guidance or exclusions, leaving selection partially to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_platform_statsGet Platform StatsARead-onlyIdempotentInspect
Live platform stats: total entities and BORME acts, counted live. Country and Entia Home counts are null (marked _unverified) until they are measured.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| _meta | No | |
| status | No | |
| cache_ttl | No | |
| countries | No | |
| borme_acts | No | |
| _unverified | No | Figures NOT independently verified — honesty marker, do not quote as verified |
| last_updated | No | |
| sources_active | No | |
| total_entities | No | |
| homes_published | No | |
| countries_active | No | |
| jsonld_generated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower, yet the description adds real behavioral context: counts are computed live rather than cached, and Country/Entia Home values may be null and flagged _unverified until measured. That caveat prevents an agent from misreading placeholder nulls as real zero values.
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 tight sentences with no filler. The core scope (total entities and BORME acts) is front-loaded, and the data-quality caveat follows only because it changes how the result should be read.
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?
An output schema exists, so return values need no explanation, and with no parameters there is little else to document. The description supplies the one thing the structured data cannot convey — that nulls are unmeasured rather than genuinely empty — though it stops short of routing the agent relative to sibling tools.
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 takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. The description's mention of _unverified relates to output fields, which is covered by the output schema rather than parameter semantics.
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 resource and its contents: platform-wide totals for entities and BORME acts. It is clearly an aggregate-stats tool, distinct in kind from the entity-specific lookups among its siblings, though it never names or contrasts with them explicitly.
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?
Usage is implied rather than stated — an agent infers this is a global overview call as opposed to per-entity tools like entity_lookup or get_entity_home. No when-to-use or when-not-to-use guidance and no named alternatives are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_showcaseGet ShowcaseARead-onlyIdempotentInspect
Curated IBEX35 + EU entity examples. FREE — does not consume quota. Use to explore data depth.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Sample size (default 3, max 5) | |
| category | No | Subset to sample (default: all) |
Output Schema
| Name | Required | Description |
|---|---|---|
| _meta | No | |
| unlock | No | |
| checkout | No | |
| entities | No | |
| upgrade_url | No | |
| access_level | No | |
| gated_fields | No | |
| upgrade_hint | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds meaningful behavior beyond that: it explicitly says the operation is FREE and does not consume quota, and notes that results are curated rather than exhaustive. This is useful operational context for an agent deciding whether to invoke 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?
Two short sentences communicate scope, cost behavior, and intended use with no filler. The most important qualifier, 'does not consume quota', is front-loaded. Every clause 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?
This is a simple, optional-parameter, read-only sampling tool with a full output schema and complete parameter documentation. The description supplies the missing operational context—curated, free, quota-free, exploratory—so an agent has everything needed to invoke it correctly without additional inference.
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 schema already documents limit and ategory well. The description's mention of 'IBEX35 + EU' loosely aligns with the category enum values but adds no new parameter information beyond what the schema provides. 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 identifies the tool as returning curated IBEX35 and EU entity examples, which distinguishes its purpose as a sampler/exploration tool. It lacks an explicit verb like 'returns' or 'retrieves', and it does not directly contrast with sibling tools, but the resource and intent are clear.
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 'Use to explore data depth' gives a clear intended context, and the quota note helps the agent know when cost is a concern. However, it does not explicitly state when to prefer this over alternatives such as search_entities or entity_lookup, nor does it provide exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
professional_lookupProfessional LookupARead-onlyIdempotentInspect
Verify professional registrations across 24 Spanish health/legal/psychology verticals. Returns colegiado number, college, specialty, status.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Professional name, colegiado number, or REPS identifier | |
| vertical | No | Healthcare/legal vertical (dental, medicos, psicologia, ...) |
Output Schema
| Name | Required | Description |
|---|---|---|
| _meta | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds scope context ('24 Spanish health/legal/psychology verticals') and lists returned fields, but does not disclose additional behavioral traits such as external source behavior, rate limits, or missing-result handling.
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 two short sentences: the first states the tool's core purpose, and the second lists the key return fields. It is front-loaded, free of filler, and every sentence adds useful information.
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, read-only lookup with complete schema descriptions and an output schema, the description is largely sufficient. It could add a brief explicit pointer to sibling tools or an example, but nothing essential is missing for selecting and invoking it correctly.
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%, with query described as 'Professional name, colegiado number, or REPS identifier' and vertical as 'Healthcare/legal vertical (dental, medicos, psicologia, ...)'. The tool description itself adds little parameter-level meaning beyond naming the vertical domains, so a 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 opens with a specific action and resource: 'Verify professional registrations' across 24 named Spanish health/legal/psychology verticals. It clearly separates this tool from generic siblings like entity_lookup or search_entities, and the listed return fields make the purpose concrete.
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: use it to verify professional registration data across Spanish verticals, and it names the vertical categories. It does not explicitly mention when not to use it or point to a sibling alternative, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_risk_auditRun Risk AuditARead-onlyIdempotentInspect
Run comprehensive AI-readiness + digital risk audit on any domain. Analyzes SSL, DNS, structured data, LLM visibility. Returns risk score 0-100. 5 req/min, 30s timeout.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional business name for context | |
| domain | Yes | Domain to audit (clinicadental.es, example.com) | |
| sector_id | No | Optional sector hint (dental, legal, talleres, …) |
Output Schema
| Name | Required | Description |
|---|---|---|
| _meta | No | |
| audit | No | |
| domain | No | |
| job_id | No | |
| status | No | |
| risk_level | No | |
| risk_score | No | |
| audit_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuinely non-obvious operational context: a 5 req/min rate limit and a 30s timeout, which matter for a potentially slow audit call.
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?
Four compact sentences, each carrying distinct information: purpose, analysis scope, return value, and operational limits. The core purpose is front-loaded with zero 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?
With an output schema present and annotations covering the safety profile, the description needs mainly to convey scope and operational constraints, which it does. Only minor gaps remain, such as failure behavior or whether a partial audit is possible.
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 name, domain, and sector_id are already documented in the schema with examples and a regex pattern. The description adds no parameter-level detail (e.g., how sector_id affects the audit), so 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?
States a specific verb (run) and resource (AI-readiness + digital risk audit) with explicit scope ('on any domain') and enumerates the analyzed dimensions (SSL, DNS, structured data, LLM visibility). No sibling tool performs an audit, so the agent can distinguish it immediately.
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?
There is no when-to-use or when-not-to-use guidance and no mention of any alternative tool. 'On any domain' implies broad applicability but gives the agent no routing criteria against siblings like entity_lookup or get_full_dossier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_entitiesSearch EntitiesARead-onlyIdempotentInspect
Search businesses by name, keyword, country, city or sector. Results mix registry-backed companies and public business listings (local directories/maps), so not every result is registry-verified; use entity_lookup or verify_vat to verify one. Answers 'find me a dentist in Madrid' / 'list law firms in Barcelona'. sector is a closed vocabulary — see the enum; aliases such as abogados resolve to their canonical slug. Anonymous callers receive a trace-level preview (name + city); authenticated TRACE+ keys unlock full records.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Search query — company name or keywords | |
| city | No | City name (Madrid, Barcelona, Valencia, Sevilla, London) | |
| limit | No | Max results (default 10, max 50) | |
| sector | No | Sector filter. Canonical: dental, legal, estetica, psicologia, medicos, talleres, veterinarios, reformas, inmobiliarias, asesorias, gimnasios… Aliases (abogados, salud, dentist, beautysalon…) resolve to a canonical slug and the response declares the translation in _meta.sector_resolved_from. | |
| country | No | ISO country code (es, gb, fr) |
Output Schema
| Name | Required | Description |
|---|---|---|
| _meta | No | Carries sector_resolved_from when an alias was translated |
| count | No | |
| filters | No | Filters actually applied — echoes q/sector/city/country |
| entities | No | Each carries name, city, sector and canonical Entia Home URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, open-world and non-destructive behavior, so the safety profile is covered structurally. Beyond that the description does add genuinely useful context – results are a mix of registry-backed companies and unverified public listing data, and output is tier-gated by API key level. Naming the mixed provenance is a real behavioral caveat, though it does not discuss rate limits or pagination.
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?
Four dense sentences, each carrying a distinct load: capability, result provenance, routing to verification siblings, example queries, then the sector-vocabulary rule and the auth-tier rule. The most decision-relevant information (what it searches, what it returns, which sibling verifies) comes first.
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?
Five parameters, one enum and an output schema present, and the description still supplies the two things the schema cannot: the reliability of the result set and the auth-dependent result gating. Return-value detail is correctly left to the output schema, and the _meta field is mentioned only where it affects interpretation.
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 earns above that by explaining that `sector` is a closed vocabulary, that aliases resolve to canonical slugs, and that the resolution is reported back in `_meta.sector_resolved_from`. That resolves the main ambiguity an agent would hit when it sees 80+ enum values containing both English and Spanish synonyms.
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 (search) plus the resource (businesses) and the facets available (name, keyword, country, city, sector), then explicitly names the alternatives it is NOT (entity_lookup, verify_vat). An agent can separate discovery search from lookup/verification without opening a schema.
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 concrete usage contexts ('find me a dentist in Madrid', 'list law firms in Barcelona') and routes the agent to entity_lookup or verify_vat when a single result must be verified. It also states the access precondition: anonymous callers get a trace-level preview while authenticated TRACE+ keys unlock full records.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_vatVerify VATARead-onlyIdempotentInspect
Real-time EU VAT validation via VIES (27 countries). Returns {valid, name, address, vat_number, country, checked_at}. Some Member States (Spain among them) do not disclose name/address through VIES: name/address come back null with name_disclosure=withheld_by_member_state; use entity_lookup for the registered name.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | EU VAT number (ESA28015865, A28015865, IE6388047V) | |
| vat | No | Alias for `q` — the VAT number. | |
| query | No | Alias for `q`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| _meta | No | |
| query | No | |
| result | No | VIES answer: validity, registered name and address |
| vat_number | No | |
| country_code | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only/idempotent/open-world safety, so the description's job is added context — and it delivers: 'real-time' signals a live call with no caching, and the Spain/withheld_by_member_state null-name behavior is a non-obvious failure mode an agent would otherwise misread as a bad VAT number. That is exactly the kind of quirk annotations cannot express.
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, no filler. The core capability leads, the return shape follows inline, and the caveat plus its remediation land last — the front-loading order matches how an agent reads a definition.
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?
An output schema exists, so the description is not obliged to enumerate return values, yet it names the key ones cheaply. Combined with the withheld-disclosure edge case and the sibling handoff, everything needed to call this correctly and interpret a null result 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?
Schema coverage is 100% and the schema already documents q and its vat/query aliases with format examples (ESA28015865, IE6388047V), so the description correctly does not repeat them. It adds marginal value by naming vat_number among the returned fields, which loosely connects the input to output, but it adds no input syntax or constraint 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?
States a specific action and resource ('Real-time EU VAT validation via VIES') with the scope (27 EU countries) pinned down. It also separates itself from the sibling entity_lookup by assigning that tool the registered-name use case, so an agent can discriminate without opening either schema.
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 a clear routing rule: if name/address come back null with name_disclosure=withheld_by_member_state, use entity_lookup instead. That is concrete when-else guidance rather than vague context, but it only covers the fallback path — there is no explicit statement of when verify_vat should not be used (e.g. non-EU VAT or already-cached lookups).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zone_profileZone ProfileARead-onlyIdempotentInspect
Socioeconomic profile of a Spanish postal code — 17 blocks: income, employment, demographics, business census, real estate, FTTH, poverty, tourism.
| Name | Required | Description | Default |
|---|---|---|---|
| postal_code | Yes | Spanish 5-digit postal code (28013 = Madrid Gran Vía) |
Output Schema
| Name | Required | Description |
|---|---|---|
| _meta | No | |
| economy | No | |
| province | No | |
| income_aeat | No | |
| postal_code | No | |
| real_estate | No | |
| municipality | No | |
| employment_sepe | No | |
| businesses_dirce | No | |
| demographics_ine | No | |
| autonomous_community | No | |
| entia_classification | No | |
| digital_infrastructure | No | |
| poverty_inequality_ccaa | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds useful context about the breadth of returned data (17 blocks), but discloses nothing about data freshness, coverage limits, or how unknown postal codes are handled.
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, front-loaded sentence that wastes no words: it leads with the resource and scope, then lists contents. Nothing is redundant with the title or schema.
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?
With an output schema present, the description need not explain return values, and it helpfully previews the 17 blocks. For a one-parameter read-only tool this is nearly complete; only the absence of any routing guidance to sibling tools keeps it short of a 5.
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% and the single parameter is well documented in the schema, including the pattern and a Madrid example. The description adds no further parameter meaning, so the baseline 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 names a specific resource (socioeconomic profile) and its scope (a Spanish postal code), then enumerates the 17 content blocks it returns. This clearly distinguishes it from sibling tools like entity_lookup, professional_lookup, and run_risk_audit, which operate on entities rather than geographic zones.
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 says what the tool returns but never states when to reach for it instead of alternatives such as get_full_dossier or run_risk_audit, nor any prerequisites or exclusions. Usage is only inferable from the fact that it takes a postal code.
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.
4 tool updates
- Changed
get_entity_home_projection4 fields changed- changed
Input schema / properties / city / patternPrevious value: -"^[a-z0-9-]+$"New value: +"^[A-Za-z0-9-]+$" - changed
Input schema / properties / country / patternPrevious value: -"^[a-z]{2}$"New value: +"^[A-Za-z]{2}$" - changed
Input schema / properties / sector / patternPrevious value: -"^[a-z0-9-]+$"New value: +"^[A-Za-z0-9-]+$" - changed
Input schema / properties / slug / patternPrevious value: -"^[a-z0-9-]+$"New value: +"^[A-Za-z0-9-]+$"
- Changed
get_platform_stats2 fields changed- changed
Output schema / properties / countries / typePrevious value: -"array"New value: +[ + "array", + "null" +] - changed
Output schema / properties / countries_active / typePrevious value: -"integer"New value: +[ + "integer", + "null" +]
- Changed
run_risk_audit1 field changed- changed
Input schema / properties / domain / patternPrevious value: -"^[a-z0-9]([a-z0-9.-]*[a-z0-9])?\\.[a-z]{2,}$"New value: +"^(?:https?://)?[A-Za-z0-9]([A-Za-z0-9.-]*[A-Za-z0-9])?\\.[A-Za-z]{2,}(?:[/?#].*)?$"
- Changed
zone_profile1 field changed- changed
Input schema / properties / postal_code / patternPrevious value: -"^[0-9]{5}$"New value: +"^[0-9]{4,5}$"
4 tool updates
- Changed
entity_lookup4 fields changed- added
Output schema / properties / integrityAdded value: +{ + "description": "Tamper-evidence MAC. Not an electronic signature", + "type": "object" +} - removed
Output schema / properties / legal_frameworkRemoved value: -{ - "type": "object" -} - added
Output schema / properties / provenanceAdded value: +{ + "description": "Publisher and data sources of this answer", + "type": "object" +} - removed
Output schema / properties / signatureRemoved value: -{ - "description": "Provenance signature of this answer", - "type": "string" -}
- Changed
get_full_dossier4 fields changed- added
Output schema / properties / integrityAdded value: +{ + "type": "object" +} - removed
Output schema / properties / legal_frameworkRemoved value: -{ - "type": "object" -} - added
Output schema / properties / provenanceAdded value: +{ + "type": "object" +} - removed
Output schema / properties / signatureRemoved value: -{ - "type": "string" -}
- Changed
get_showcase2 fields changed- added
Input schema / properties / categoryAdded value: +{ + "description": "Subset to sample (default: all)", + "enum": [ + "all", + "ibex", + "tech", + "banking", + "energy", + "retail", + "spain", + "eu" + ], + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Sample size (default 3, max 5)", + "maximum": 5, + "minimum": 1, + "type": "integer" +}
- Changed
professional_lookup1 field changed- added
Input schema / properties / verticalAdded value: +{ + "description": "Healthcare/legal vertical (dental, medicos, psicologia, ...)", + "maxLength": 40, + "type": "string" +}
12 tool updates
- Changed
entity_lookup1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "Identity resolution result. `found` is fail-closed: false means no identity anchor was corroborated, not 'try again'.", + "properties": { + "_meta": { + "type": "object" + }, + "coherence_errors": { + "items": { + "type": "string" + }, + "type": "array" + }, + "data_coverage": { + "description": "Which sources answered and which did not", + "type": "object" + }, + "economic_profile": { + "type": "object" + }, + "entity": { + "description": "Verified identity: legal name, tax id, address, sector", + "type": "object" + }, + "error_code": { + "type": "string" + }, + "found": { + "description": "True only when an identity anchor corroborated the query", + "type": "boolean" + }, + "legal_framework": { + "type": "object" + }, + "query": { + "type": "string" + }, + "registry_data": { + "description": "Official registry payload (BORME/GLEIF/VIES/native)", + "type": "object" + }, + "signature": { + "description": "Provenance signature of this answer", + "type": "string" + } + }, + "type": "object" +}
- Changed
get_competitors1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "Ranked competitors in the same sector and city. Spain only on the public surface.", + "properties": { + "_meta": { + "description": "Carries sector_resolved_from / sector_resolved_to", + "type": "object" + }, + "city": { + "type": "string" + }, + "competitors": { + "items": { + "type": "object" + }, + "type": "array" + }, + "count": { + "type": "integer" + }, + "country": { + "type": "string" + }, + "sector": { + "description": "Canonical slug actually used after alias resolution", + "type": "string" + } + }, + "type": "object" +}
- Changed
get_entia_home1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "Full Schema.org @graph of an Entia Home page — the same truth as its public HTML twin.", + "properties": { + "@context": { + "type": "string" + }, + "@graph": { + "description": "WebPage, Entity, Verification Report and Territorial Profile nodes", + "items": { + "type": "object" + }, + "type": "array" + }, + "_meta": { + "type": "object" + } + }, + "type": "object" +}
- Changed
get_entity_home_projection1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "entia.entity_home_projection.v1 snapshot: claims, corroboration gate and policy.", + "properties": { + "_meta": { + "type": "object" + }, + "claims": { + "type": "object" + }, + "corroboration": { + "type": "object" + }, + "gate": { + "description": "PUBLISH / PARTIAL / HOLD / REGISTRY_ONLY", + "type": "string" + }, + "generated_at": { + "type": "string" + }, + "materializer_version": { + "type": "string" + }, + "policy": { + "type": "object" + }, + "projection": { + "type": "object" + }, + "schema": { + "type": "string" + }, + "subject": { + "type": "object" + } + }, + "type": "object" +}
- Changed
get_full_dossier1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "Aggregated dossier: identity, registry, trust and verification in one call.", + "properties": { + "_meta": { + "type": "object" + }, + "data_coverage": { + "type": "object" + }, + "entity": { + "type": "object" + }, + "found": { + "type": "boolean" + }, + "legal_framework": { + "type": "object" + }, + "query": { + "type": "string" + }, + "signature": { + "type": "string" + }, + "trust_score": { + "type": "object" + }, + "verification": { + "type": "object" + } + }, + "type": "object" +}
- Changed
get_platform_stats1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "Live platform totals. Single source of truth for corpus size.", + "properties": { + "_meta": { + "type": "object" + }, + "_unverified": { + "description": "Figures NOT independently verified — honesty marker, do not quote as verified", + "items": { + "type": "string" + }, + "type": "array" + }, + "borme_acts": { + "type": "integer" + }, + "cache_ttl": { + "type": "integer" + }, + "countries": { + "items": { + "type": "string" + }, + "type": "array" + }, + "countries_active": { + "type": "integer" + }, + "homes_published": { + "type": "integer" + }, + "jsonld_generated": { + "type": "integer" + }, + "last_updated": { + "type": "string" + }, + "sources_active": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "total_entities": { + "type": "integer" + } + }, + "type": "object" +}
- Changed
get_showcase1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "Curated sample entities for evaluation. Fields are gated by tier.", + "properties": { + "_meta": { + "type": "object" + }, + "access_level": { + "type": "string" + }, + "checkout": { + "type": "object" + }, + "entities": { + "items": { + "type": "object" + }, + "type": "array" + }, + "gated_fields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "unlock": { + "type": "object" + }, + "upgrade_hint": { + "type": "string" + }, + "upgrade_url": { + "type": "string" + } + }, + "type": "object" +}
- Changed
professional_lookup1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "Professional registration verification across Spanish health, legal and psychology registries. Enterprise DPA required.", + "properties": { + "_meta": { + "type": "object" + } + }, + "type": "object" +}
- Changed
run_risk_audit1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "AI-readiness and digital risk audit of a domain.", + "properties": { + "_meta": { + "type": "object" + }, + "audit": { + "type": "object" + }, + "audit_token": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "job_id": { + "type": "string" + }, + "risk_level": { + "type": "string" + }, + "risk_score": { + "type": "number" + }, + "status": { + "type": "string" + } + }, + "type": "object" +}
- Changed
search_entities1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "Paged catalogue search over the verified corpus.", + "properties": { + "_meta": { + "description": "Carries sector_resolved_from when an alias was translated", + "type": "object" + }, + "count": { + "type": "integer" + }, + "entities": { + "description": "Each carries name, city, sector and canonical Entia Home URL", + "items": { + "type": "object" + }, + "type": "array" + }, + "filters": { + "description": "Filters actually applied — echoes q/sector/city/country", + "type": "object" + } + }, + "type": "object" +}
- Changed
verify_vat1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "Real-time VIES validation.", + "properties": { + "_meta": { + "type": "object" + }, + "country_code": { + "type": "string" + }, + "query": { + "type": "string" + }, + "result": { + "description": "VIES answer: validity, registered name and address", + "type": "object" + }, + "vat_number": { + "type": "string" + } + }, + "type": "object" +}
- Changed
zone_profile1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "Socioeconomic profile of a Spanish postal code, 17 blocks from official sources.", + "properties": { + "_meta": { + "type": "object" + }, + "autonomous_community": { + "type": "string" + }, + "businesses_dirce": { + "type": "object" + }, + "demographics_ine": { + "type": "object" + }, + "digital_infrastructure": { + "type": "object" + }, + "economy": { + "type": "object" + }, + "employment_sepe": { + "type": "object" + }, + "entia_classification": { + "type": "object" + }, + "income_aeat": { + "type": "object" + }, + "municipality": { + "type": "string" + }, + "postal_code": { + "type": "string" + }, + "poverty_inequality_ccaa": { + "type": "object" + }, + "province": { + "type": "string" + }, + "real_estate": { + "type": "object" + } + }, + "type": "object" +}
2 tool updates
- Changed
get_competitors7 fields changed- changed
Input schema / properties / city / descriptionPrevious value: -"City name (Madrid, Barcelona, London, Paris)"New value: +"City name in Spain (Madrid, Barcelona, Valencia, Sevilla, Bilbao)" - added
Input schema / properties / limit / descriptionAdded value: +"Max results (1-30)" - changed
Input schema / properties / limit / maximumPrevious value: -50New value: +30 - changed
Input schema / properties / sector / descriptionPrevious value: -"ENTIA sector slug (estetica, dental, psicologia, legal, …)"New value: +"ENTIA sector slug. Canonical: dental, legal, estetica, psicologia, medicos, talleres, veterinarios, reformas, inmobiliarias, asesorias, gimnasios… Aliases (abogados, salud, dentist, beautysalon…) resolve to a canonical slug and the response declares the translation in _meta.sector_resolved_from." - added
Input schema / properties / sector / enumAdded value: +[ + "abogados", + "accountingservice", + "asesoria", + "asesorias", + "attorney", + "automocion", + "automotivebusiness", + "autorepair", + "barberia", + "barberias", + "beautysalon", + "belleza", + "clinicas", + "construccion", + "consultoria", + "dental", + "dentist", + "dentista", + "ecommerce", + "educacion", + "energia", + "estetica", + "exercisegym", + "farmacia", + "farmacias", + "financial", + "financialservice", + "fisio", + "fisioterapia", + "foodestablishment", + "generalcontractor", + "gestion", + "gestoria", + "gestorias", + "gimnasio", + "gimnasios", + "hairsalon", + "healthandbeautybusiness", + "healthcare", + "healthclub", + "homeandconstructionbusiness", + "hospital", + "hospitality", + "inmobiliaria", + "inmobiliarias", + "insurance", + "insuranceagency", + "legal", + "legalservice", + "medicalbusiness", + "medicalclinic", + "medico", + "medicos", + "nutricion", + "optica", + "opticas", + "optician", + "peluqueria", + "peluquerias", + "pharmacy", + "physician", + "physiotherapyclinic", + "podologia", + "psicologia", + "psychologist", + "realestate", + "realestateagent", + "reformas", + "restauracion", + "restaurant", + "restaurantes", + "rrhh", + "saas", + "salud", + "security", + "seguros", + "sportsactivitylocation", + "taller", + "talleres", + "telecom", + "turismo", + "veterinario", + "veterinarios", + "veterinarycare" +] - removed
Input schema / properties / sector / maxLengthRemoved value: -50 - removed
Input schema / properties / sector / minLengthRemoved value: -2
- Changed
search_entities3 fields changed- added
Input schema / properties / cityAdded value: +{ + "description": "City name (Madrid, Barcelona, Valencia, Sevilla, London)", + "maxLength": 100, + "minLength": 2, + "type": "string" +} - changed
Input schema / properties / sector / descriptionPrevious value: -"Sector filter (dental, legal, talleres, estetica, …)"New value: +"Sector filter. Canonical: dental, legal, estetica, psicologia, medicos, talleres, veterinarios, reformas, inmobiliarias, asesorias, gimnasios… Aliases (abogados, salud, dentist, beautysalon…) resolve to a canonical slug and the response declares the translation in _meta.sector_resolved_from." - added
Input schema / properties / sector / enumAdded value: +[ + "abogados", + "accountingservice", + "asesoria", + "asesorias", + "attorney", + "automocion", + "automotivebusiness", + "autorepair", + "barberia", + "barberias", + "beautysalon", + "belleza", + "clinicas", + "construccion", + "consultoria", + "dental", + "dentist", + "dentista", + "ecommerce", + "educacion", + "energia", + "estetica", + "exercisegym", + "farmacia", + "farmacias", + "financial", + "financialservice", + "fisio", + "fisioterapia", + "foodestablishment", + "generalcontractor", + "gestion", + "gestoria", + "gestorias", + "gimnasio", + "gimnasios", + "hairsalon", + "healthandbeautybusiness", + "healthcare", + "healthclub", + "homeandconstructionbusiness", + "hospital", + "hospitality", + "inmobiliaria", + "inmobiliarias", + "insurance", + "insuranceagency", + "legal", + "legalservice", + "medicalbusiness", + "medicalclinic", + "medico", + "medicos", + "nutricion", + "optica", + "opticas", + "optician", + "peluqueria", + "peluquerias", + "pharmacy", + "physician", + "physiotherapyclinic", + "podologia", + "psicologia", + "psychologist", + "realestate", + "realestateagent", + "reformas", + "restauracion", + "restaurant", + "restaurantes", + "rrhh", + "saas", + "salud", + "security", + "seguros", + "sportsactivitylocation", + "taller", + "talleres", + "telecom", + "turismo", + "veterinario", + "veterinarios", + "veterinarycare" +]
1 tool update
- Removed
ai_ready_profile
2 tool updates
- Changed
get_entia_home1 field changed- added
Input schema / additionalPropertiesAdded value: +false
- Removed
lookup_by_domain
1 tool update
- Added
get_entity_home_projection
2 tool updates
- Changed
entity_lookup3 fields changed- added
Input schema / properties / nameAdded value: +{ + "description": "Alias for `q` — accepted for compatibility with clients that send `name`.", + "type": "string" +} - added
Input schema / properties / queryAdded value: +{ + "description": "Alias for `q` — accepted for compatibility with clients that send `query`.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "q" -]New value: +[]
- Changed
verify_vat3 fields changed- added
Input schema / properties / queryAdded value: +{ + "description": "Alias for `q`.", + "type": "string" +} - added
Input schema / properties / vatAdded value: +{ + "description": "Alias for `q` — the VAT number.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "q" -]New value: +[]
1 tool update
- Removed
borme_lookup
2 tool updates
- Removed
full_dossier - Added
get_full_dossier
14 tool updates
- Changed
ai_ready_profile7 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / countryRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "ISO country code (ES, GB, FR, DE...). Auto-detected when possible." -} - removed
Input schema / properties / embed_htmlRemoved value: -{ - "default": false, - "description": "If true, also returns ready-to-paste <script type='application/ld+json'> tag for direct injection in your website's <head>.", - "type": "boolean" -} - changed
Input schema / properties / query / descriptionPrevious value: -"Company name (e.g. 'Telefonica'), Spanish CIF (e.g. A28015865), EU VAT (e.g. ESA28015865), or LEI"New value: +"Company name or domain" - added
Input schema / properties / query / maxLengthAdded value: +500 - added
Input schema / properties / query / minLengthAdded value: +2 - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
borme_lookup14 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / cifRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Alias for query — pass CIF here if your client serializes 'cif' instead of 'query'" -} - removed
Input schema / properties / company / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / company / defaultRemoved value: -null - changed
Input schema / properties / company / descriptionPrevious value: -"Alias for query — pass company name here if your client serializes 'company'"New value: +"Company name or CIF" - added
Input schema / properties / company / maxLengthAdded value: +500 - added
Input schema / properties / company / minLengthAdded value: +2 - added
Input schema / properties / company / typeAdded value: +"string" - removed
Input schema / properties / limitRemoved value: -{ - "default": 20, - "description": "Max mercantile acts to return (1-50)", - "maximum": 50, - "minimum": 1, - "type": "integer" -} - removed
Input schema / properties / nameRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Alias for query — pass company name here if your client serializes 'name'" -} - removed
Input schema / properties / qRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Alias for query — pass here if your client serializes 'q'" -} - removed
Input schema / properties / queryRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Spanish CIF (e.g. B80988678) or company name" -} - added
Input schema / requiredAdded value: +[ + "company" +] - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
entity_lookup12 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / countryRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "ISO country code (ES, GB, FR...). Auto-detected from VAT prefix if not provided" -} - removed
Input schema / properties / nameRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Alias for query — pass company name here if your client serializes 'name'" -} - removed
Input schema / properties / q / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / q / defaultRemoved value: -null - changed
Input schema / properties / q / descriptionPrevious value: -"Alias for query — pass here if your client serializes 'q' instead of 'query'"New value: +"Company name, CIF/NIF (B82846825), EU VAT (ESB82846825), or LEI (20 chars)" - added
Input schema / properties / q / maxLengthAdded value: +500 - added
Input schema / properties / q / minLengthAdded value: +2 - added
Input schema / properties / q / typeAdded value: +"string" - removed
Input schema / properties / queryRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "CIF (e.g. B80988678), EU VAT (e.g. ESB80988678, FR12345678901), LEI (20 alphanumeric chars), or company name" -} - added
Input schema / requiredAdded value: +[ + "q" +] - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Added
full_dossier - Changed
get_competitors11 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - changed
Input schema / properties / city / descriptionPrevious value: -"City name (e.g. Madrid, Barcelona, Valencia, Sevilla, Bilbao, Malaga)"New value: +"City name (Madrid, Barcelona, London, Paris)" - added
Input schema / properties / city / maxLengthAdded value: +100 - added
Input schema / properties / city / minLengthAdded value: +2 - removed
Input schema / properties / countryRemoved value: -{ - "default": "ES", - "description": "ISO country code", - "type": "string" -} - removed
Input schema / properties / limit / descriptionRemoved value: -"Max results (1-30)" - changed
Input schema / properties / limit / maximumPrevious value: -30New value: +50 - changed
Input schema / properties / sector / descriptionPrevious value: -"Business sector: dental, legal, estetica, psicologia, talleres, veterinarios, reformas, inmobiliarias, asesorias, gimnasios, medicos, arquitectos, farmacias, opticas, fisioterapia, podologia, logopedia, nutricion, enfermeria..."New value: +"ENTIA sector slug (estetica, dental, psicologia, legal, …)" - added
Input schema / properties / sector / maxLengthAdded value: +50 - added
Input schema / properties / sector / minLengthAdded value: +2 - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Added
get_entia_home - Added
get_platform_stats - Changed
get_showcase5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / categoryRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": "all", - "description": "Filter: 'all' | 'ibex' | 'tech' | 'banking' | 'energy' | 'retail' | 'spain' | 'eu'" -} - removed
Input schema / properties / limitRemoved value: -{ - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": 10, - "description": "Max entities to return (default 10, max 50)" -} - added
Input schema / requiredAdded value: +[] - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Added
lookup_by_domain - Changed
professional_lookup9 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / limitRemoved value: -{ - "default": 10, - "description": "Max results (1-50)", - "maximum": 50, - "minimum": 1, - "type": "integer" -} - removed
Input schema / properties / provinceRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Province filter (e.g. Madrid, Barcelona, Valencia)" -} - changed
Input schema / properties / query / descriptionPrevious value: -"Professional name, colegiado number, or specialty keyword"New value: +"Professional name, colegiado number, or REPS identifier" - added
Input schema / properties / query / maxLengthAdded value: +500 - added
Input schema / properties / query / minLengthAdded value: +2 - removed
Input schema / properties / registryRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "(Legacy) raw registry: 'reps' (523K), 'dentistas' (44K), 'psicologos' (3.5K). Prefer `vertical` for the 11 sanitary verticals." -} - removed
Input schema / properties / verticalRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Healthcare vertical: dental, medicos, enfermeria, farmacia, veterinarios, psicologia, fisioterapia, optica, podologia, nutricion, logopedia. Auto-routes to the best registry + filter. Use this instead of `registry` for clarity." -} - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Added
run_risk_audit - Changed
search_entities15 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / cityRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "City name (e.g. Madrid, Barcelona, Valencia, Sevilla, London)" -} - removed
Input schema / properties / country / defaultRemoved value: -"ES" - changed
Input schema / properties / country / descriptionPrevious value: -"ISO country code"New value: +"ISO country code (es, gb, fr)" - added
Input schema / properties / country / maxLengthAdded value: +2 - added
Input schema / properties / country / minLengthAdded value: +2 - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (1-50)"New value: +"Max results (default 10, max 50)" - changed
Input schema / properties / q / descriptionPrevious value: -"Company name or partial name to search"New value: +"Search query — company name or keywords" - added
Input schema / properties / q / maxLengthAdded value: +500 - added
Input schema / properties / q / minLengthAdded value: +2 - removed
Input schema / properties / sector / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / sector / defaultRemoved value: -null - changed
Input schema / properties / sector / descriptionPrevious value: -"Business sector filter: dental, legal, estetica, psicologia, talleres, veterinarios, reformas, inmobiliarias, asesorias, gimnasios, medicos, arquitectos, farmacias, opticas, fisioterapia, podologia, logopedia, nutricion, enfermeria..."New value: +"Sector filter (dental, legal, talleres, estetica, …)" - added
Input schema / properties / sector / typeAdded value: +"string" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
verify_vat7 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / cifRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Alias for vat_id — pass Spanish CIF here (with or without ES prefix)" -} - added
Input schema / properties / qAdded value: +{ + "description": "EU VAT number (ESA28015865, A28015865, IE6388047V)", + "maxLength": 20, + "minLength": 4, + "type": "string" +} - removed
Input schema / properties / vatRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Alias for vat_id — pass VAT here if your client serializes 'vat'" -} - removed
Input schema / properties / vat_idRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "EU VAT number with country prefix (e.g. ESB80988678, FR12345678901, DE123456789)" -} - added
Input schema / requiredAdded value: +[ + "q" +] - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
zone_profile9 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / cpRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Alias for postal_code — pass here if your client serializes 'cp' instead of 'postal_code'" -} - removed
Input schema / properties / postal_code / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / postal_code / defaultRemoved value: -null - changed
Input schema / properties / postal_code / descriptionPrevious value: -"Spanish postal code (5 digits, e.g. 28001, 08001, 41001)"New value: +"Spanish 5-digit postal code (28013 = Madrid Gran Vía)" - added
Input schema / properties / postal_code / patternAdded value: +"^[0-9]{5}$" - added
Input schema / properties / postal_code / typeAdded value: +"string" - added
Input schema / requiredAdded value: +[ + "postal_code" +] - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
1 tool update
- Added
professional_lookup
Related MCP Servers
- AlicenseNot gradedqualityBmaintenancePerplexity for social: ask what competitors are running across social and get answers grounded in real ad and creative data, not guesses.2Apache 2.0
- AlicenseCqualityBmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs119 npmMIT
- AlicenseAqualityCmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.1611 npm1MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.