Referencia MCP · servidor 1.1.2-worker

Acceso MCP a la infraestructura
de identidad económica de ENTIA.

Coverage: 10 published registry countries in the live corpus · 51 Entia Home launch countries (38 Europe + 13 LatAm) · 57-country generator matrix.

Resolución de entidades, verificación, procedencia, contexto económico, proyecciones ENTIA Home y evidencia legible por máquina. El catálogo no se mantiene a mano: esta página se genera desde el Worker desplegado y el mapa canónico de planes. tools/list es la autoridad operativa para nombres, esquemas y disponibilidad; las respuestas de ejemplo identifican siempre la fecha en que fueron medidas.

Endpoint
https://mcp.entia.systems/mcp
Protocolo
2024-11-05 JSON-RPC 2.0
Herramientas
12 6 abiertas · 6 por plan
Autenticación
API key u OAuth 2.1

01Conectar

Una URL. Sin SDK, sin puente stdio, sin registro previo.

El servidor habla HTTP directo. No hay que instalar nada, no hay SDK propio y no hace falta un puente stdio.

Cliente MCP con transporte HTTP

Configuración mínimajson
{
  "mcpServers": {
    "entia": {
      "url": "https://mcp.entia.systems/mcp"
    }
  }
}

Sin credencial funcionan 6 de las 12 herramientas, tres de ellas con la respuesta reducida. Para abrir el resto, añade la cabecera:

Con clavejson
{
  "mcpServers": {
    "entia": {
      "url": "https://mcp.entia.systems/mcp",
      "headers": {
        "X-ENTIA-Key": "TU_CLAVE"
      }
    }
  }
}

Sin cliente: JSON-RPC a pelo

Listar las herramientasshell
curl -s -X POST https://mcp.entia.systems/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
Fuente de verdad

Orden de autoridad: tools/list en producción define el catálogo y los esquemas; services/mcp-ts/src/index.js define el runtime; core/mcp/plans.py define gating, cuotas y tiers; esta página es una representación generada. Si existe una discrepancia, la documentación no gana al runtime.

El saludo inicial

Peticiónjson-rpc
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {
    "protocolVersion": "2024-11-05",
    "capabilities": {},
    "clientInfo": {
      "name": "mi-cliente",
      "version": "1.0"
    }
  }
}
Respuesta REAL medida el 2026-08-27json-rpc
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "protocolVersion": "2024-11-05",
    "capabilities": {
      "tools": {
        "listChanged": false
      },
      "resources": {
        "listChanged": false,
        "subscribe": false
      },
      "prompts": {
        "listChanged": false
      }
    },
    "serverInfo": {
      "name": "entia-mcp-ts",
      "version": "1.1.2-worker"
    }
  }
}
Detalle del handshake

El servidor no negocia la revisión del protocolo: responde siempre 2024-11-05, aunque pidas otra. Si tu cliente exige una revisión posterior, tenlo en cuenta antes de integrarlo.

02Protocolo

Qué métodos existen, qué devuelven y qué no está implementado.

Transporte HTTP con JSON-RPC 2.0 en el cuerpo. No hay SSE, no hay sesiones y no se emite mcp-session-id: cada petición se basta a sí misma. Se aceptan lotes (un array de peticiones); un lote formado solo por notificaciones responde 202 sin cuerpo.

MétodoEstadoQué hace
initializesíDevuelve versión de protocolo, capacidades y datos del servidor.
notifications/initializedsíSe acepta y se ignora, como manda la especificación.
pingsíComprobación de vida.
tools/listsíLas 12 herramientas con su esquema de entrada y de salida.
tools/callsíInvoca una herramienta.
resources/listsí, vacíoDevuelve []. Se implementa para no romper clientes estrictos.
resources/templates/listsí, vacíoDevuelve [].
prompts/listsí, vacíoDevuelve [].
resources/read, prompts/get, sampling/createMessage, completion/completenoFuera del alcance: la superficie de ENTIA es solo herramientas.
Por qué están vacías y no ausentes

Las capacidades resources y prompts se declaran y se sirven vacías a propósito. Declarar una capacidad y luego devolver -32601 al método correspondiente rompe a los clientes que confían en el saludo inicial, y es motivo de rechazo en las revisiones de directorio de conectores.

Forma de la respuesta

Toda herramienta devuelve el mismo envoltorio: un bloque de texto con el JSON serializado y, además, structuredContent con el mismo objeto ya parseado —las 12 declaran esquema de salida—. Si algo falla dentro de la herramienta, el envoltorio llega con isError: true y el detalle dentro del texto.

Envoltorio de tools/calljson-rpc
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [ { "type": "text", "text": "{ ...el JSON de la herramienta... }" } ],
    "structuredContent": { "...el mismo objeto, ya parseado..." },
    "isError": false
  }
}

El bloque _meta

Casi todas las respuestas traen un _meta con la trazabilidad de esa llamada.

CampoQué significa
cache_statusmiss, kv_hit, static, kv_mcp_tool_cache. Dice de dónde salió la respuesta.
fast_path_usedSi se resolvió por el camino rápido sin tocar el origen.
latency_msMilisegundos del cálculo. Si la respuesta es cacheada, es la latencia del cálculo original, no la de tu llamada.
phase_timingsDesglose por fase cuando la herramienta orquesta varias fuentes.
sources / sourceLas fuentes públicas empleadas, nombradas.
_unverifiedLos campos que el servidor no puede acreditar y por eso devuelve nulos.
_cache_hit · _cached_at · _cache_ttlPresentes en las herramientas con caché de servidor. Te dicen de cuándo es el documento.
Latencia fósil

Un latency_ms alto junto a _cache_hit: true no significa que el servicio vaya lento: significa que ese documento tardó eso en construirse cuando se construyó. Medido en get_full_dossier: latency_ms: 3022 en una respuesta servida desde caché en milisegundos. Para medir latencia de servicio, mídela en tu cliente.

03Autenticación

Clave de API u OAuth 2.1 con registro dinámico. Y qué pasa si no mandas nada.

Dos esquemas, ambos vivos. Elige uno.

1 · Clave de API

Cabecerahttp
X-ENTIA-Key: TU_CLAVE

# equivalente exacto:
Authorization: Bearer TU_CLAVE

Si mandas las dos, gana Authorization. Se consigue una clave gratuita de nivel TRACE por correo, sin tarjeta:

Alta de clave TRACEshell
curl -s -X POST https://api.entia.systems/api/v1/mcp/register \
  -H 'Content-Type: application/json' \
  -d '{"email":"tu@empresa.com"}'

2 · OAuth 2.1 con registro dinámico de cliente

El propio servidor es su autoridad de autorización. Un cliente MCP remoto puede darse de alta solo, sin que nadie le entregue credenciales por otro canal.

MetadatoValor
Descubrimiento del recurso/.well-known/oauth-protected-resource/mcp
Descubrimiento del emisor/.well-known/oauth-authorization-server
Registro dinámicoPOST /oauth/register (RFC 7591, abierto)
AutorizaciónGET /oauth/authorize
TokenPOST /oauth/token
Concesionesauthorization_code, refresh_token, client_credentials
PKCES256, obligatorio
Ámbitomcp (único)
Vida del token30 días (código de autorización) · 24 h (credenciales de cliente) · 90 días el de refresco
Cómo funciona por dentro

Los tokens son sobres sellados que envuelven una clave de ENTIA: no hay almacén de sesiones en el servidor. Un token vale exactamente lo que valga la clave que lleva dentro.

Sin credencial

6 de las 12 herramientas responden sin clave. Tres de ellas —entity_lookup, search_entities y verify_vat— devuelven una vista reducida: el servidor recorta la respuesta y lo declara con access_level, la lista gated_fields y _meta.redacted_for_anon: true. No es un fallo silencioso; la propia respuesta te dice qué falta y qué lo abre.

Límites de frecuencia

LlamanteLímite
Anónimo10 peticiones por minuto
Con credencial60 peticiones por minuto
run_risk_audit5 por minuto, por ser una auditoría de red en vivo
Lo que NO vas a recibir

El servidor MCP no devuelve cabeceras X-RateLimit-* ni RateLimit-*, y tampoco Retry-After. Verificado sobre respuestas reales el 2026-08-27. Si tu cliente las espera para autolimitarse, no las va a encontrar: limita por tu lado a partir de los números de la tabla.

04Las 12 herramientas

Esquema publicado, llamada copiable, respuesta real y las trampas de cada una.

Primero se presenta el mapa de capacidades y después la referencia exhaustiva. Cada ficha lleva el esquema de entrada publicado por el servidor, una llamada copiable, una respuesta real y las limitaciones observadas.

Mapa de capacidades

FamiliaQué resuelveToolsAccesoCatálogo vivo
Identidad y verificaciónConvertir un identificador, un nombre o un número de IVA en una entidad con procedencia.43 abiertas · 1 gatedentity_lookup
search_entities
verify_vat
get_full_dossier
Contexto y mercadoAñadir contexto territorial, competencia y señales de riesgo verificables.30 abiertas · 3 gatedzone_profile
get_competitors
run_risk_audit
Corpus publicadoLeer la proyección pública de una entidad y su representación ENTIA Home.21 abierta · 1 gatedget_entia_home
get_entity_home_projection
Descubrimiento y plataformaDescubrir ejemplos, cobertura y estado operativo de la plataforma.22 abiertas · 0 gatedget_showcase
get_platform_stats
Datos personales, bajo contratoVerificación profesional minimizada cuando existe base contractual y DPA.10 abiertas · 1 gatedprofessional_lookup

Identidad y verificación

Convertir un identificador, un nombre o un número de IVA en una entidad con procedencia.

entity_lookup

AbiertaVista reducida sin clave

¿Quién es esta empresa y qué parte de su identidad está corroborada por un registro?

Resuelve una entidad a partir de un identificador o de un nombre y devuelve su identidad, la cadena de verificación fuente por fuente y un perfil económico del código postal donde está domiciliada. Es la tool de entrada del servidor: casi cualquier flujo empieza aquí.

Cuándo usarla

Úsala cuando el agente tenga un CIF/NIF, un VAT europeo, un LEI o un nombre y necesite convertirlo en una entidad con procedencia. Si ya tienes la ruta canónica de la ficha, get_entia_home es más barato.

Entrada

ParámetroTipoRestriccionesDescripción
qstringopcionalmín. long. 2, máx. long. 500Company name, CIF/NIF (B82846825), EU VAT (ESB82846825), or LEI (20 chars)
querystringopcional—Alias for `q` — accepted for compatibility with clients that send `query`.
namestringopcional—Alias for `q` — accepted for compatibility with clients that send `name`.

Llamada

tools/calljson-rpc
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "entity_lookup",
    "arguments": {
      "q": "A28015865"
    }
  }
}
El mismo ejemplo con curlshell
curl -s -X POST https://mcp.entia.systems/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"entity_lookup","arguments":{"q":"A28015865"}}}'

Qué devuelve

CampoQué es
foundBooleano. false no es un error: es la respuesta.
entityIdentidad normalizada: nombre, legal_id, vat_id, lei, país, ciudad, CP, web, sector, wikidata_qid.
trust_scorescore 0-100, dimensions (array mixto: números y etiquetas como PENDING o BORME_REGISTERED) y badge.
verificationResumen por fuente en texto: borme, entities_master, vies, wikidata.
sourcesEl detalle crudo de cada fuente consultada, con su estado y su marca de recolección.
economic_profileRenta, cotizaciones y paro del municipio. Es contexto del CP, no de la empresa.
borme_dataacts_count, acts y officers. Frecuentemente vacío: ver advertencias.
Respuesta REAL medida el 2026-08-27json
{
  "found": true,
  "query": "A28015865",
  "entity": {
    "name": "TELEFONICA SA",
    "id": "A28015865",
    "legal_id": "A28015865",
    "vat_id": "A28015865",
    "lei": "",
    "country_code": "ES",
    "city": "Madrid",
    "postal_code": "28013",
    "website": "https://www.telefonica.com",
    "sector": "telecom",
    "wikidata_qid": "Q160229"
  },
  "trust_score": {
    "score": 81,
    "dimensions": [
      100,
      75,
      85,
      70,
      "PENDING",
      "BORME_REGISTERED"
    ],
    "badge": "PARTIAL",
    "badge_warn": true
  },
  "verification": {
    "borme": "VERIFIED (A28015865)",
    "entities_master": "FOUND (entity_service)",
    "vies": "VERIFIED",
    "wikidata": "FOUND"
  },
  "sources": {
    "vies": {
      "source": "VIES EU REST",
      "status": "valid",
      "valid": true,
      "name": "disclosure_restricted",
      "address": "disclosure_restricted",
      "note": "ES tax authority does not disclose name/address via VIES (privacy)."
    },
    "gleif": {
      "source": "gleif",
      "status": "not_found"
    },
    "__truncado__": "entities_master, borme y wikidata omitidos por brevedad"
  },
  "borme_data": {
    "cif": "A28015865",
    "acts_count": 0,
    "acts": [],
    "officers": []
  },
  "_meta": {
    "latency_ms": 124,
    "cache_status": "kv_hit",
    "fast_path_used": true,
    "via": "entity_service_kv",
    "cost_usd": 0
  }
}
Lo que hay que saber antes de integrar

El esquema declara required: [] pero el servidor exige uno de los tres alias

Las tres propiedades q, query y name figuran como opcionales. Llamar sin ninguna devuelve -32602 con el mensaje one of 'q', 'query', 'name' is required. Un validador JSON-Schema estricto en el cliente dará por válido {}: la restricción es de ejecución, no de esquema.

borme_data.acts suele venir vacío incluso en entidades con actos

Medido en TELEFONICA SA (A28015865): acts_count: 0 y acts: [], mientras sources.borme confirma la entidad con la nota BORME CIF master index (full acts in separate parquets). Lo que se sirve por defecto es el índice maestro por CIF, no el expediente de actos.

Sin credencial la respuesta viene REDACTADA, y lo dice

El llamante anónimo recibe access_level: "trace_preview", la lista gated_fields con lo que falta y _meta.redacted_for_anon: true. trust_score está entre los campos retenidos: cualquier cliente que lo lea sin clave obtendrá KeyError.

La respuesta autenticada trae un sello de integridad que NO es una firma

Es un código de autenticación simétrico calculado con un secreto que solo tiene ENTIA: detecta modificación de una respuesta emitida por ENTIA y solo ENTIA puede verificarlo. No prueba origen ante un tercero y no es firma, sello ni sello de tiempo electrónico. Lee Procedencia y límites antes de darle valor probatorio.

Tier mínimo
abierta
Credencial
opcional
Caché de edge
300 s
Timeout
20 s
Origen
/api/v1/demo/lookup

search_entities

AbiertaVista reducida sin clave

¿Qué empresas verificadas hay que encajen con este criterio?

Busca en el corpus por texto libre con filtros de país, ciudad y sector. Devuelve registros con contacto, identificador fiscal y, sobre todo, la canonical_url de la ficha publicada de cada entidad.

Cuándo usarla

Es el punto de partida cuando no tienes identificador. La canonical_url que devuelve es la que alimenta a get_entia_home y get_entity_home_projection: encadenar por ahí evita construir rutas a mano.

Entrada

ParámetroTipoRestriccionesDescripción
qstringrequeridomín. long. 2, máx. long. 500Search query — company name or keywords
countrystringopcionalmín. long. 2, máx. long. 2ISO country code (es, gb, fr)
citystringopcionalmín. long. 2, máx. long. 100City name (Madrid, Barcelona, Valencia, Sevilla, London)
sectorstringopcional84 valores en enumSector 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.
limitintegeropcionalmín. 1, máx. 50, defecto 10Max results (default 10, max 50)

Llamada

tools/calljson-rpc
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "search_entities",
    "arguments": {
      "q": "dental",
      "country": "es",
      "city": "Madrid",
      "sector": "dental",
      "limit": 3
    }
  }
}
El mismo ejemplo con curlshell
curl -s -X POST https://mcp.entia.systems/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_entities","arguments":{"q":"dental","country":"es","city":"Madrid","sector":"dental","limit":3}}}'

Qué devuelve

CampoQué es
countNúmero de registros devueltos, no el total de coincidencias del corpus.
entities[]Nombre, ciudad, país, sector, teléfono, web, dirección, CP, región, vat_id, rating.
entities[].canonical_urlRuta publicada de la ficha. El puente hacia las tools de Entia Home.
filtersLos filtros tal como los aplicó el servidor tras normalizar. Compáralos con los que enviaste.
_meta.sector_resolved_fromPresente solo si enviaste un alias de sector. Declara la traducción.
Respuesta REAL medida el 2026-08-27json
{
  "count": 3,
  "entities": [
    {
      "name": "ALBUS DENTAL STUDIO - Dentista en Mirasierra",
      "city": "Madrid",
      "country_code": "ES",
      "sector": "dental",
      "phone": "620 19 98 86",
      "website": "http://www.albusdental.com/",
      "address": "C. de La Masó, 2, Fuencarral-El Pardo, 28034 Madrid",
      "postal_code": "28034",
      "region": "MADRID",
      "vat_id": "ESB09850447",
      "rating": null,
      "name_slug": "albus-dental-studio-dentista-en-mirasierra",
      "city_slug": "madrid",
      "canonical_url": "https://entia.systems/v1/identity/es/dental/madrid/albus-dental-studio-dentista-en-mirasierra"
    },
    {
      "__truncado__": "2 registros más omitidos por brevedad"
    }
  ],
  "filters": {
    "q": "dental",
    "sector": "dental",
    "city": "Madrid",
    "country": "es"
  },
  "_meta": {
    "bq_degraded": false,
    "latency_ms": 752,
    "cache_status": "miss",
    "fast_path_used": false
  }
}
Lo que hay que saber antes de integrar

sector es un vocabulario cerrado con alias, y la traducción se declara

El enum publicado mezcla 33 slugs canónicos con sus alias. Enviar abogados devuelve filters.sector: "legal" y _meta.sector_resolved_from: "abogados". Verificado en las dos direcciones: un valor fuera del enum se rechaza en el edge con -32602.

q y sector se combinan con AND

Medido: q="clinica dental" con sector="abogados" devuelve count: 0. No es un fallo de cobertura: son dos filtros que no se solapan.

count no es el tamaño del universo

No hay campo de total ni cursor de paginación. limit llega a 50; por encima de eso no existe forma de recorrer el resto en esta tool.

Sin credencial devuelve una vista reducida

El llamante anónimo recibe una previsualización de nivel traza (esencialmente nombre y ciudad). Los registros completos exigen clave.

Tier mínimo
abierta
Credencial
opcional
Caché de edge
300 s
Timeout
20 s
Origen
/api/v1/v3/search_entities

verify_vat

AbiertaVista reducida sin clave

¿Este número de IVA europeo es válido ahora mismo?

Consulta VIES, el sistema de intercambio de información sobre el IVA de la Comisión Europea, en tiempo real. No devuelve una copia de ENTIA: devuelve lo que contesta la administración.

Cuándo usarla

Antes de facturar intracomunitario, al dar de alta un proveedor, o como control previo a cualquier operación en la que el IVA determine el tratamiento fiscal.

Entrada

ParámetroTipoRestriccionesDescripción
qstringopcionalmín. long. 4, máx. long. 20EU VAT number (ESA28015865, A28015865, IE6388047V)
vatstringopcional—Alias for `q` — the VAT number.
querystringopcional—Alias for `q`.

Llamada

tools/calljson-rpc
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "verify_vat",
    "arguments": {
      "q": "IE6388047V"
    }
  }
}
El mismo ejemplo con curlshell
curl -s -X POST https://mcp.entia.systems/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"verify_vat","arguments":{"q":"IE6388047V"}}}'

Qué devuelve

CampoQué es
result.validBooleano. Es el veredicto.
result.name / result.addressRazón social y domicilio si el Estado miembro los divulga. Ver advertencias.
country_code / vat_numberEl número descompuesto tal como se envió a VIES.
_meta.sourceIdentifica la fuente y su URL oficial. La procedencia viaja en la respuesta.
Respuesta REAL medida el 2026-08-27json
{
  "query": "IE6388047V",
  "country_code": "IE",
  "vat_number": "6388047V",
  "result": {
    "source": "vies",
    "status": "valid",
    "valid": true,
    "name": "GOOGLE IRELAND LIMITED",
    "address": "3RD FLOOR, GORDON HOUSE, BARROW STREET, DUBLIN 4",
    "vat_number": "IE6388047V",
    "_cached": false
  },
  "_meta": {
    "source": "VIES — EU VAT Information Exchange System (European Commission)",
    "url": "https://ec.europa.eu/taxation_customs/vies/",
    "latency_ms": 187,
    "cache_status": "miss",
    "fast_path_used": false
  }
}
Lo que hay que saber antes de integrar

La divulgación de nombre y dirección depende del país, y esto cambia el resultado

Medido el mismo día: IE6388047V devuelve GOOGLE IRELAND LIMITED con domicilio completo; cualquier VAT español devuelve "name": "disclosure_restricted" porque la AEAT no publica esos campos por VIES. Un cliente que espere siempre razón social fallará en España, que es el mayor volumen del corpus. Para el nombre legal español usa entity_lookup, que lo resuelve contra BORME.

Un valid: false puede ser un número mal formado o un número dado de baja

VIES no distingue ambos casos en su respuesta, y ENTIA no inventa la diferencia.

Depende de la disponibilidad de VIES

Si el servicio de la Comisión no responde, la tool no puede responder. Es una consulta en vivo, no una réplica local, y esa es exactamente la garantía que aporta.

Tier mínimo
abierta
Credencial
opcional
Caché de edge
3600 s
Timeout
20 s
Origen
/api/v1/v3/verify_vat

get_full_dossier

INTEGRATE+

¿Puedo tener en una sola llamada todo lo que ENTIA sabe de esta empresa?

Agregador para diligencia debida y KYB. Resuelve la entidad y, si tiene código postal, le añade el perfil territorial completo, devolviendo un único documento.

Cuándo usarla

Cuando el coste de orquestar varias llamadas desde el agente supera el de recibir un documento grande. Para una comprobación puntual, entity_lookup es más barato y —en cuatro bloques— más completo.

Entrada

ParámetroTipoRestriccionesDescripción
querystringrequeridomín. long. 2, máx. long. 200Company name, CIF/NIF, EU VAT, or LEI

Llamada

tools/calljson-rpc
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_full_dossier",
    "arguments": {
      "query": "A28015865"
    }
  }
}
El mismo ejemplo con curlshell
curl -s -X POST https://mcp.entia.systems/mcp \
  -H 'Content-Type: application/json' \
  -H "X-ENTIA-Key: $ENTIA_KEY" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_full_dossier","arguments":{"query":"A28015865"}}}'

Qué devuelve

CampoQué es
entity · verificationIdentidad y estado por fuente, con status explícito: ok, not_run, not_found.
zone_profileEl perfil territorial completo, anidado, si la entidad tiene código postal.
_meta.fields_populatedRecuento de hojas no nulas de ESTA respuesta. Ver advertencias.
_meta.sources_called[] · sources_ok[] · sources_failed[]Qué se llamó de verdad y con qué resultado.
_cache_hit · _cached_at · _cache_ttlEstado de caché de servidor. La respuesta te dice si es fresca.
Respuesta REAL medida el 2026-08-27json
{
  "query": "TELEFONICA SA",
  "found": true,
  "entity": {
    "name": "TELEFONICA SA",
    "id": "A28015865",
    "country_code": "ES",
    "postal_code": "28013",
    "city": "Madrid",
    "address": null,
    "sector": "telecom",
    "website": "https://www.telefonica.com",
    "vat_id": "A28015865"
  },
  "trust_score": null,
  "data_coverage": null,
  "signature": null,
  "legal_framework": null,
  "verification": {
    "vies": {
      "status": "ok",
      "checked": true,
      "valid": true
    },
    "gleif": {
      "status": "not_run",
      "checked": false,
      "found": false,
      "data": null
    },
    "wikidata": {
      "status": "ok",
      "checked": true,
      "found": true
    },
    "borme": {
      "status": "ok",
      "checked": true,
      "found": true
    },
    "professional": {
      "status": "not_run",
      "checked": false,
      "found": false,
      "data": null
    }
  },
  "zone_profile": {
    "__truncado__": "perfil territorial completo anidado, idéntico a zone_profile"
  },
  "_meta": {
    "tool": "get_full_dossier",
    "version": "v1.0.0",
    "fields_populated": 381,
    "sources_called": [
      "entity_lookup",
      "zone_profile"
    ],
    "sources_failed": [],
    "sources_ok": [
      "entity_lookup",
      "zone_profile"
    ],
    "latency_ms": 3022,
    "cache_status": "kv_mcp_tool_cache",
    "fast_path_used": true
  },
  "_cache_hit": true,
  "_cached_at": "2026-08-27T03:05:03.068942+00:00",
  "_cache_ttl": 86400
}
Lo que hay que saber antes de integrar

No existe un número fijo de campos, y cualquier cifra publicada como constante es falsa

fields_populated se calcula en tiempo de ejecución contando hojas no nulas del documento: cambia con cada entidad. Medido en A28015865: 381. La descripción de la tool dice «90+». Una empresa sin código postal, sin VAT o sin ficha publicada devolverá bastante menos. Lee el campo; no lo supongas.

Devuelve nulos cuatro bloques que entity_lookup sí puebla

Medido sobre la misma entidad y el mismo día: trust_score, signature, legal_framework y data_coverage llegan a null aquí y poblados en entity_lookup. Si necesitas la puntuación de confianza, llama a entity_lookup: el agregador no la incluye hoy.

«Cuatro fuentes en paralelo» describe el árbol, no las llamadas

Medido: sources_called: ["entity_lookup", "zone_profile"]. BORME y VIES no son llamadas propias del agregador: viajan anidadas dentro de la verificación de entity_lookup. El resultado es correcto; la cuenta de fuentes, no.

_meta.latency_ms en una respuesta cacheada es la latencia FÓSIL del cálculo original

Medido: _cache_hit: true, _cached_at de las 03:05 y latency_ms: 3022 en una respuesta servida a las 06:44 en milisegundos. Ese número describe cuánto tardó construir el documento cacheado, no cuánto ha tardado tu llamada. No lo uses como métrica de servicio. Para medir latencia real, mídela en tu cliente.

La caché de esta tool dura siete días

Es la más larga del servidor. Un dato registral no cambia a diario, pero si tu caso de uso exige frescura, _cached_at te dice exactamente de cuándo es el documento.

Tier mínimo
INTEGRATE
Credencial
obligatoria
Caché de edge
604800 s
Timeout
20 s
Origen
/api/v1/v3/full_dossier

Contexto y mercado

Situar a esa entidad en su territorio y en su sector.

zone_profile

SIGNAL+

¿Cómo es el territorio en el que opera esta empresa?

Perfil socioeconómico de un código postal español a partir de once fuentes públicas: renta AEAT, paro SEPE, padrón y demografía empresarial INE, matriculaciones DGT, hipotecas, valor de vivienda MITMA, cobertura de fibra MITECO, pobreza y desigualdad de la Encuesta de Condiciones de Vida y seis encuestas de ocupación turística.

Cuándo usarla

Para cualificar un lead por capacidad económica de la zona, para dimensionar un mercado local o para dar contexto territorial a una decisión de crédito o de expansión.

Entrada

ParámetroTipoRestriccionesDescripción
postal_codestringrequeridopatrón ^[0-9]{5}$Spanish 5-digit postal code (28013 = Madrid Gran Vía)

Llamada

tools/calljson-rpc
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "zone_profile",
    "arguments": {
      "postal_code": "28013"
    }
  }
}
El mismo ejemplo con curlshell
curl -s -X POST https://mcp.entia.systems/mcp \
  -H 'Content-Type: application/json' \
  -H "X-ENTIA-Key: $ENTIA_KEY" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"zone_profile","arguments":{"postal_code":"28013"}}}'

Qué devuelve

CampoQué es
income_aeatRenta bruta y media, estimaciones netas, número de declaraciones, cotizaciones a la Seguridad Social.
employment_sepeParo registrado del municipio y una ratio derivada que a menudo no es servible: ver advertencias.
demographics_inePoblación, nacimientos por sexo, matrimonios.
businesses_dirce[]Censo de empresas por sección CNAE, con scope municipal o nacional en cada fila.
entia_classificationÍndice de capacidad económica (0-10), segmento, categoría ICE y tier. Es una clasificación de ENTIA, no de un organismo público.
real_estate · digital_infrastructureValor tasado por m² (media provincial) y cobertura FTTH y 100 Mbps.
poverty_inequality_ccaa[] · tourism_demand_provincial[]Series por comunidad autónoma y por provincia. Ojo al ámbito.
_meta.sources[]Las once fuentes, nombradas. La procedencia viaja en cada respuesta.
Respuesta REAL medida el 2026-08-27json
{
  "postal_code": "28013",
  "municipality": "Madrid",
  "province": "MADRID",
  "autonomous_community": "Comunidad de Madrid",
  "income_aeat": {
    "renta_bruta_anual": 44204,
    "renta_media_anual": 34051,
    "num_declaraciones": 7402,
    "source": "AEAT — Agencia Tributaria (Hacienda)",
    "coverage": "official"
  },
  "employment_sepe": {
    "paro_registrado": {
      "value": 145086,
      "unit": "persons",
      "scope": "municipality"
    },
    "ratio_paro_vs_declaraciones_pct": {
      "value": null,
      "unit": "percent",
      "scope": "postal_code_estimate",
      "comparable": false,
      "warning": "source_value_out_of_percent_range_not_served",
      "raw_value": 1895.2
    },
    "source": "SEPE — Servicio Publico de Empleo Estatal"
  },
  "entia_classification": {
    "economic_capacity_index": 7,
    "economic_segment": "ALTO",
    "ice_category": "E",
    "audience_quality_score": null,
    "tier": "T1_PREMIUM"
  },
  "digital_infrastructure": {
    "fiber_ftth_coverage_pct": 99.4045,
    "broadband_100mbps_coverage_pct": 99.9801,
    "source": "MITECO / SETELECO — cobertura banda ancha municipal 2021-2024"
  },
  "__truncado__": "demographics_ine, economy, businesses_dirce, real_estate, poverty_inequality_ccaa y tourism_demand_provincial omitidos",
  "_meta": {
    "sources": [
      "AEAT ...",
      "SEPE ...",
      "INE ...",
      "DGT ...",
      "MITMA ...",
      "MITECO ..."
    ],
    "postal_codes_covered": 10865,
    "latency_ms": 199,
    "cache_status": "miss"
  }
}
Lo que hay que saber antes de integrar

El ámbito geográfico cambia dentro de la misma respuesta

Pides un código postal, pero employment_sepe y demographics_ine son municipales, real_estate y el turismo son provinciales, y poverty_inequality_ccaa es autonómico. Cada bloque declara su scope o su source. Mezclarlos como si fueran del mismo nivel produce conclusiones falsas: la población que devuelve el CP 28013 es la de Madrid entera.

Un valor que no es servible se declara, no se sirve

Medido: ratio_paro_vs_declaraciones_pct llega con value: null, comparable: false, warning: "source_value_out_of_percent_range_not_served" y el raw_value: 1895.2 que motivó el rechazo. Una ratio del 1.895 % no es un porcentaje: es la señal de que el numerador y el denominador no comparten ámbito. El servidor prefiere entregarte el problema antes que un número redondo.

La descripción anuncia diecisiete bloques y la respuesta medida trae quince claves

Ni el esquema de salida publicado ni la respuesta real llegan a diecisiete. Cuenta sobre la respuesta, no sobre la descripción.

_meta.bq_degraded es un nombre heredado

Se mantiene por compatibilidad con clientes existentes. El motor de consulta es DuckDB sobre R2; BigQuery está decomisionado desde mayo de 2026. Lee el campo por lo que hace, no por cómo se llama.

Tier mínimo
SIGNAL
Credencial
obligatoria
Caché de edge
600 s
Timeout
20 s
Origen
/api/v1/v3/zone_profile

get_competitors

BUILD+

¿Qué otras empresas del mismo sector operan en esta ciudad?

Devuelve entidades que comparten sector y ciudad con la que estás analizando. Solo España en la superficie pública.

Cuándo usarla

Para encuadrar a una empresa en su mercado local antes de una recomendación, una valoración o un informe de posicionamiento.

Entrada

ParámetroTipoRestriccionesDescripción
sectorstringrequerido84 valores en enumENTIA 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.
citystringrequeridomín. long. 2, máx. long. 100City name in Spain (Madrid, Barcelona, Valencia, Sevilla, Bilbao)
limitintegeropcionalmín. 1, máx. 30, defecto 10Max results (1-30)

Llamada

tools/calljson-rpc
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_competitors",
    "arguments": {
      "sector": "dental",
      "city": "Madrid",
      "limit": 3
    }
  }
}
El mismo ejemplo con curlshell
curl -s -X POST https://mcp.entia.systems/mcp \
  -H 'Content-Type: application/json' \
  -H "X-ENTIA-Key: $ENTIA_KEY" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_competitors","arguments":{"sector":"dental","city":"Madrid","limit":3}}}'

Qué devuelve

CampoQué es
count · sector · city · countryLos filtros efectivos y el tamaño del resultado.
competitors[]Nombre, dirección, CP, teléfono, web, región, rating.
Respuesta REAL medida el 2026-08-27json
{
  "count": 3,
  "sector": "dental",
  "city": "Madrid",
  "country": "ES",
  "competitors": [
    {
      "name": "ALBUS DENTAL STUDIO - Dentista en Mirasierra",
      "city": "Madrid",
      "address": "C. de La Masó, 2, Fuencarral-El Pardo, 28034 Madrid",
      "postal_code": "28034",
      "phone": "620 19 98 86",
      "website": "http://www.albusdental.com/",
      "region": "MADRID",
      "rating": null
    },
    {
      "__truncado__": "2 registros más omitidos"
    }
  ],
  "_meta": {
    "latency_ms": 211,
    "cache_status": "miss",
    "fast_path_used": false
  }
}
Lo que hay que saber antes de integrar

La descripción dice «ranked» y la respuesta no trae ningún criterio de orden

Medido con dental / Madrid / limit=3: los mismos tres registros y en el mismo orden que search_entities con idénticos filtros. No hay rank, ni score, ni similarity, ni distancia, y rating llega nulo. Trata el resultado como un conjunto de coincidencias por sector y ciudad, no como una clasificación.

No acepta un identificador de empresa

Los parámetros son sector y city: no hay competidores de esta entidad concreta. Resuelve primero la entidad con entity_lookup y usa su sector y su ciudad.

limit admite hasta 30 en el MCP

El equivalente REST acepta valores mayores y los recorta a 30 sin avisar. En el MCP el enum del esquema ya lo impide.

Tier mínimo
BUILD
Credencial
obligatoria
Caché de edge
600 s
Timeout
20 s
Origen
/api/v1/v3/get_competitors

run_risk_audit

SIGNAL+

¿Está este dominio preparado para que una IA lo lea, lo entienda y lo cite?

Audita un dominio y devuelve una puntuación de riesgo de 0 a 100 con seis categorías, la lista de carencias detectadas y un conjunto de parches propuestos sobre el marcado estructurado.

Cuándo usarla

Para diagnosticar por qué una empresa no aparece bien representada ante modelos y agentes, y para obtener una lista accionable de qué falta.

Entrada

ParámetroTipoRestriccionesDescripción
domainstringrequeridomín. long. 3, máx. long. 253, patrón ^[a-z0-9]([a-z0-9.-]*[a-z0-9])?\.[a-z]{2,}$Domain to audit (clinicadental.es, example.com)
sector_idstringopcional—Optional sector hint (dental, legal, talleres, …)
namestringopcional—Optional business name for context

Llamada

tools/calljson-rpc
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "run_risk_audit",
    "arguments": {
      "domain": "albusdental.com",
      "sector_id": "dental"
    }
  }
}
El mismo ejemplo con curlshell
curl -s -X POST https://mcp.entia.systems/mcp \
  -H 'Content-Type: application/json' \
  -H "X-ENTIA-Key: $ENTIA_KEY" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"run_risk_audit","arguments":{"domain":"albusdental.com","sector_id":"dental"}}}'

Qué devuelve

CampoQué es
risk_score · risk_levelPuntuación agregada y su etiqueta.
audit.current_status.gaps[]Carencias nombradas: missing_schema, missing_dmarc, missing_vat…
category_scoresSeis ejes: infraestructura, confianza, presencia, contenido, frescura, económico.
predictive_oracleProyección a 30 y 90 días. Es salida de un modelo, no una medición.
autonomic_intervention.patches[]Parches propuestos en formato JSON Patch sobre el grafo de la entidad.
audit_token · job_idIdentificadores para correlacionar la auditoría con soporte.
Respuesta REAL medida el 2026-08-27json
{
  "status": "OK",
  "job_id": "6f3f1242f94745eb922b5cd70bdd69b7",
  "domain": "albusdental.com",
  "risk_score": 63.9,
  "risk_level": "HIGH RISK",
  "audit": {
    "current_status": {
      "risk_score": 63.9,
      "instability_index": 18.9,
      "gaps_detected": 11,
      "gaps": [
        "missing_socials",
        "missing_geo",
        "missing_action",
        "missing_vat",
        "missing_phone",
        "missing_schema",
        "missing_email",
        "missing_gleif",
        "missing_wikidata",
        "missing_h1",
        "missing_dmarc"
      ],
      "category_scores": {
        "infrastructure": 44.5,
        "trust": 83.1,
        "presence": 61.4,
        "content": 84.2,
        "freshness": 22,
        "economic": 53.9
      }
    },
    "predictive_oracle": {
      "risk_30d": 66.9,
      "risk_90d": 72.8,
      "trend": "STABLE"
    },
    "autonomic_intervention": {
      "can_auto_heal": true,
      "projected_risk_after_heal": 33,
      "patches": [
        {
          "op": "verify_then_add",
          "path": "/taxID",
          "value": null,
          "reason": "Fiscal identifier missing. No placeholder taxID is emitted.",
          "required_evidence": "official registry, VIES, BORME, Companies House, or equivalent source"
        },
        {
          "__truncado__": "4 parches más omitidos"
        }
      ]
    },
    "hard_fails": []
  },
  "audit_token": "dcfe516306f54c41a3996e2d9b419c1b",
  "_meta": {
    "cache_status": "miss",
    "fast_path_used": false,
    "latency_ms": 3313
  }
}
Lo que hay que saber antes de integrar

Los parches verify_then_add llegan con value: null a propósito

Cuando falta un dato que solo puede venir de una fuente —el identificador fiscal, las coordenadas, un perfil social—, el servidor no propone un valor: propone la operación y declara qué evidencia haría falta en required_evidence. Es la diferencia entre un auditor que rellena huecos y uno que los señala.

predictive_oracle es una proyección, no un hecho

risk_30d y risk_90d son salida de un modelo sobre el estado actual. No los presentes a un cliente como medición.

Es la tool más cara del servidor en tiempo

Límite de cinco peticiones por minuto y timeout de treinta segundos, frente a los veinte del resto. Hace comprobaciones de red en vivo contra el dominio.

audit.version devuelve hoy una cadena interna

El identificador de versión que viaja en la respuesta es un nombre en clave heredado. No lo interpretes como versión semántica de contrato; para eso está el versionado del servidor.

Tier mínimo
SIGNAL
Credencial
obligatoria
Caché de edge
300 s
Timeout
30 s
Origen
/api/v1/audit

Corpus publicado

Leer lo que ENTIA publica sobre una entidad, en la forma exacta en que lo publica.

get_entia_home

Abierta

¿Cuál es el grafo Schema.org publicado de la ficha de esta entidad?

Devuelve el @graph JSON-LD gemelo de una Entia Home, es decir, la capa máquina exacta que se sirve en /v1/identity/{país}/{sector}/{ciudad}/{slug}.jsonld.

Cuándo usarla

Cuando necesitas el marcado canónico y citable de una entidad: para incrustarlo, para compararlo con el tuyo o para dar al modelo una fuente con @id estable.

Entrada

ParámetroTipoRestriccionesDescripción
countrystringrequeridomín. long. 2, máx. long. 2, patrón ^[a-z]{2}$ISO 3166-1 alpha-2 (es, gb, fr)
sectorstringrequeridomín. long. 2, máx. long. 50, patrón ^[a-z0-9-]+$Industry slug (dental, legal, talleres, …)
citystringrequeridomín. long. 1, máx. long. 100, patrón ^[a-z0-9-]+$City slug (madrid, barcelona, london)
slugstringrequeridomín. long. 1, máx. long. 200, patrón ^[a-z0-9-]+$Business slug (clinica-dental-sonrisa)

Llamada

tools/calljson-rpc
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_entia_home",
    "arguments": {
      "country": "es",
      "sector": "dental",
      "city": "madrid",
      "slug": "albus-dental-studio-dentista-en-mirasierra"
    }
  }
}
El mismo ejemplo con curlshell
curl -s -X POST https://mcp.entia.systems/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_entia_home","arguments":{"country":"es","sector":"dental","city":"madrid","slug":"albus-dental-studio-dentista-en-mirasierra"}}}'

Qué devuelve

CampoQué es
@graphNodos Organization, WebPage, BreadcrumbList y el editor Organization de ENTIA.
_meta.sourcejsonld_twin: confirma que sale del gemelo publicado, no de un montaje del momento.
_meta.url · html_urlLas dos caras de la misma ficha: máquina y humano.
Respuesta REAL medida el 2026-08-27json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Organization",
      "@id": "https://entia.systems/v1/identity/es/dental/madrid/albus-dental-studio-dentista-en-mirasierra#org",
      "name": "ALBUS DENTAL STUDIO - Dentista en Mirasierra",
      "url": "https://entia.systems/v1/identity/es/dental/madrid/albus-dental-studio-dentista-en-mirasierra",
      "address": {
        "@type": "PostalAddress",
        "addressCountry": "ES"
      },
      "publisher": {
        "@id": "https://entia.systems/#entia"
      }
    },
    {
      "__truncado__": "WebPage, BreadcrumbList y el nodo Organization de ENTIA omitidos"
    }
  ],
  "_meta": {
    "source": "jsonld_twin",
    "url": "https://entia.systems/v1/identity/es/dental/madrid/albus-dental-studio-dentista-en-mirasierra.jsonld",
    "html_url": "https://entia.systems/v1/identity/es/dental/madrid/albus-dental-studio-dentista-en-mirasierra",
    "cache_status": "miss",
    "latency_ms": 333
  }
}
Lo que hay que saber antes de integrar

Toma segmentos de ruta, no un identificador

Exige country, sector, city y slug. No acepta CIF ni nombre. Obtén la ruta de search_entities (canonical_url) o de get_showcase en vez de construirla a mano: los slugs se generan por transliteración y no siempre coinciden con lo que esperarías.

Falla en cerrado, y eso es la garantía

Si la ficha no existe, no devuelve la página corporativa de ENTIA ni un grafo genérico: devuelve un error. Nunca vas a recibir marketing de ENTIA disfrazado de datos de la entidad.

No pasa por el gateway

Es la única tool, junto con la proyección, que se resuelve dentro de la red de Cloudflare contra el objeto publicado. Su timeout es de doce segundos, el más corto del servidor.

Tier mínimo
abierta
Credencial
opcional
Caché de edge
300 s
Timeout
12 s
Origen
JSONLD_EXTRACT

get_entity_home_projection

SIGNAL+

¿Qué afirma exactamente la ficha publicada, con su política y su procedencia?

Lee el snapshot entia.entity_home_projection.v1 de una Entia Home: las afirmaciones, la proyección y la política aplicada. Es la misma verdad que pinta la ficha HTML y su gemelo JSON-LD, sin enriquecimiento improvisado.

Cuándo usarla

Para auditar qué se está publicando sobre una entidad y bajo qué reglas, no solo el resultado renderizado.

Entrada

ParámetroTipoRestriccionesDescripción
countrystringrequeridomín. long. 2, máx. long. 2, patrón ^[a-z]{2}$ISO 3166-1 alpha-2 (es, gb, fr)
sectorstringrequeridomín. long. 2, máx. long. 50, patrón ^[a-z0-9-]+$Industry slug (dental, legal, …)
citystringrequeridomín. long. 1, máx. long. 100, patrón ^[a-z0-9-]+$City slug (madrid, barcelona)
slugstringrequeridomín. long. 1, máx. long. 200, patrón ^[a-z0-9-]+$Business slug (clinica-dental-ceodent)
include_render_contextbooleanopcionaldefecto falseIf true, keep render_context (large). Default strips it for agents.

Llamada

tools/calljson-rpc
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_entity_home_projection",
    "arguments": {
      "country": "es",
      "sector": "dental",
      "city": "madrid",
      "slug": "albus-dental-studio-dentista-en-mirasierra"
    }
  }
}
El mismo ejemplo con curlshell
curl -s -X POST https://mcp.entia.systems/mcp \
  -H 'Content-Type: application/json' \
  -H "X-ENTIA-Key: $ENTIA_KEY" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_entity_home_projection","arguments":{"country":"es","sector":"dental","city":"madrid","slug":"albus-dental-studio-dentista-en-mirasierra"}}}'

Qué devuelve

CampoQué es
claimsLas afirmaciones con su origen.
projectionLo que de esas afirmaciones llega a publicarse.
policyLa regla que decidió qué se publica y qué se retiene.
render_contextSolo si pides include_render_context: true. Es grande y por defecto se recorta.
Respuesta REAL para una ficha sin proyección materializadajson
{
  "error": "projection_not_available",
  "status": 404,
  "url": "https://entia.systems/v1/identity/es/dental/madrid/albus-dental-studio-dentista-en-mirasierra.projection.v1.json",
  "message": "Projection snapshot not available.",
  "body_excerpt": {
    "error": "projection_not_materialized",
    "message": "No entity_home_projection.v1 on R2 for this entity.",
    "schema": "entia.entity_home_projection.v1"
  }
}
Lo que hay que saber antes de integrar

No todas las fichas tienen proyección materializada, y el error lo dice sin rodeos

Medido sobre una ficha que sí existe en HTML y en JSON-LD: {"error":"projection_not_available","status":404} con el cuerpo del origen projection_not_materialized. Esta tool no es equivalente a get_entia_home: cubre un subconjunto. Trata el 404 como respuesta normal y ten un camino alternativo.

include_render_context por defecto es false por una razón

El contexto de render infla mucho la respuesta y casi nunca es lo que un agente necesita. Actívalo solo si vas a reproducir el renderizado.

Tier mínimo
SIGNAL
Credencial
obligatoria
Caché de edge
600 s
Timeout
12 s
Origen
PROJECTION_V1_FETCH

Descubrimiento y plataforma

Explorar sin gastar cuota y conocer el estado del corpus.

get_showcase

Abierta

¿Qué profundidad de dato tiene ENTIA antes de que yo pague nada?

Muestra de entidades del IBEX 35 y de la Unión Europea con una capa de verificación. Es gratuita y, a diferencia del resto, no consume cuota.

Cuándo usarla

Como primera llamada de un agente que acaba de conectarse: sirve para comprobar la conexión y para descubrir, en la propia respuesta, qué campos están cerrados y qué plan los abre.

Entrada

Entrada

No admite parámetros.

Llamada

tools/calljson-rpc
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_showcase",
    "arguments": {}
  }
}
El mismo ejemplo con curlshell
curl -s -X POST https://mcp.entia.systems/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_showcase","arguments":{}}}'

Qué devuelve

CampoQué es
entities[]Muestra con nombre, legal_id, país, sector, ciudad y estado de verificación con su fecha.
gated_fields[]Los campos que esta muestra no incluye, nombrados uno a uno.
unlockPor cada tool cerrada: tier mínimo, URL de checkout y precio mensual. Es la ruta de compra, legible por máquina.
_meta.total_in_categoryTamaño del catálogo de muestra, para que quede claro que es una muestra y no el corpus.
Respuesta REAL medida el 2026-08-27json
{
  "entities": [
    {
      "name": "TELEFONICA SA",
      "legal_id": "A28015865",
      "country": "ES",
      "sector": "telecom",
      "city": "Madrid",
      "verification": {
        "status": "partial",
        "as_of": "2026-08-20"
      }
    },
    {
      "__truncado__": "INDUSTRIA DE DISEÑO TEXTIL SA y BANCO BILBAO VIZCAYA ARGENTARIA SA omitidas"
    }
  ],
  "access_level": "showcase_sample",
  "gated_fields": [
    "node1_webpage",
    "node2_entity",
    "node3_verification",
    "node4_territorial",
    "borme_acts_recent",
    "borme_total_count"
  ],
  "unlock": {
    "zone_profile": {
      "min_tier": "signal",
      "checkout_url": "https://api.entia.systems/api/v1/mcp/checkout?tier=signal",
      "price_eur_month": 29
    },
    "get_full_dossier": {
      "min_tier": "integrate",
      "checkout_url": "https://api.entia.systems/api/v1/mcp/checkout?tier=integrate",
      "price_eur_month": 399
    }
  },
  "_meta": {
    "count": 3,
    "sample": true,
    "total_in_category": 50,
    "free_tier_safe": true,
    "note": "This tool is FREE and does NOT consume your daily quota.",
    "latency_ms": 2,
    "cache_status": "static",
    "fast_path_used": true
  }
}
Lo que hay que saber antes de integrar

Es una muestra fija, no una consulta

No acepta parámetros y devuelve siempre el mismo conjunto. Para consultar cualquier empresa real, usa entity_lookup.

El estado de verificación de la muestra es partial

No es un defecto del ejemplo: refleja el estado real de corroboración de esas entidades en el corpus el día indicado en as_of.

Tier mínimo
abierta
Credencial
opcional
Caché de edge
3600 s
Timeout
20 s
Origen
/api/v1/v3/get_showcase

get_platform_stats

Abierta

¿Qué tamaño tiene el corpus ahora mismo?

Estado vivo de la plataforma: entidades totales, desglose por país, fuentes activas y actos BORME indexados.

Cuándo usarla

Para citar el tamaño del corpus con una cifra reproducible en lugar de una copiada de una web. Cualquier número de cobertura debería salir de aquí.

Entrada

Entrada

No admite parámetros.

Llamada

tools/calljson-rpc
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_platform_stats",
    "arguments": {}
  }
}
El mismo ejemplo con curlshell
curl -s -X POST https://mcp.entia.systems/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_platform_stats","arguments":{}}}'

Qué devuelve

CampoQué es
total_entities · countries_active · sources_activeLos tres agregados de cabecera.
countriesDesglose por código ISO con el recuento de cada país.
borme_actsActos mercantiles indexados del Boletín Oficial del Registro Mercantil.
_unverified[]Los campos que el servidor NO puede acreditar hoy y que por eso devuelve nulos.
last_updated · cache_ttlCuándo se calculó y cuánto vive el valor.
Respuesta REAL medida el 2026-08-27json
{
  "status": "live",
  "total_entities": 11330391,
  "countries_active": 10,
  "sources_active": 16,
  "homes_published": null,
  "jsonld_generated": null,
  "borme_acts": 40345410,
  "countries": {
    "FR": {
      "entities": 5329485
    },
    "GB": {
      "entities": 2378286
    },
    "ES": {
      "entities": 1284964
    },
    "CH": {
      "entities": 789433
    },
    "CZ": {
      "entities": 429991
    },
    "NO": {
      "entities": 376679
    },
    "FI": {
      "entities": 261682
    },
    "SE": {
      "entities": 221624
    },
    "EE": {
      "entities": 213444
    },
    "IE": {
      "entities": 44803
    }
  },
  "_unverified": [
    "homes_published",
    "jsonld_generated"
  ],
  "last_updated": "2026-08-27T06:41:58Z",
  "cache_ttl": 60,
  "_meta": {
    "cache_status": "miss",
    "fast_path_used": false,
    "latency_ms": 284
  }
}
Lo que hay que saber antes de integrar

Dos campos llegan siempre a null y el servidor lo declara

homes_published y jsonld_generated aparecen listados en _unverified. No es un fallo del endpoint: es la aplicación de la regla de que un dato que no se puede acreditar no se sirve con un número. Si tu integración necesita esos dos valores, hoy no existen; no los deduzcas de otra parte.

cache_ttl es de 60 segundos

Dos llamadas seguidas pueden devolver exactamente el mismo objeto. Es lo esperado.

Tier mínimo
abierta
Credencial
opcional
Caché de edge
600 s
Timeout
20 s
Origen
/api/v1/stats/live

Datos personales, bajo contrato

Verificación de profesionales colegiados. Exige acuerdo de encargo de tratamiento firmado.

professional_lookup

Enterprise + DPA

¿Está este profesional colegiado y en qué situación?

Verifica registros profesionales colegiados en España: número de colegiado, colegio, especialidad y estado. La propia herramienta declara cubrir veinticuatro verticales sanitarias, jurídicas y de psicología; esa cobertura no se ha podido comprobar desde fuera porque el acceso exige contrato, así que se cita como declaración, no como medición.

Cuándo usarla

Solo dentro de un proceso con base jurídica para tratar datos personales de profesionales identificables: alta de proveedor sanitario, verificación previa a una derivación, control de cumplimiento.

Entrada

ParámetroTipoRestriccionesDescripción
querystringrequeridomín. long. 2, máx. long. 500Professional name, colegiado number, or REPS identifier

Llamada

tools/calljson-rpc
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "professional_lookup",
    "arguments": {
      "query": "28001234"
    }
  }
}
El mismo ejemplo con curlshell
curl -s -X POST https://mcp.entia.systems/mcp \
  -H 'Content-Type: application/json' \
  -H "X-ENTIA-Key: $ENTIA_KEY" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"professional_lookup","arguments":{"query":"28001234"}}}'

Qué devuelve

CampoQué es
Registro colegialNúmero, colegio, especialidad y estado, con minimización aplicada.
_gdprBloque que declara la minimización efectuada sobre la respuesta.
Respuesta REAL sin DPA (HTTP 403)json
{
  "error": "dpa_required",
  "status": 403,
  "tool": "professional_lookup",
  "message": "Tool 'professional_lookup' exposes personal data (GDPR). It requires Enterprise tier with a signed Data Processing Agreement. TRACE/self-serve does NOT unlock it.",
  "required_tier": "enterprise",
  "dpa_required": true,
  "contact": "fv@entia.systems"
}
Lo que hay que saber antes de integrar

Requiere tier Enterprise CON acuerdo de encargo de tratamiento firmado

Es la única tool del servidor que trata datos personales de personas físicas. Ninguna clave self-serve la abre, y el plan por sí solo tampoco: hace falta el DPA. El acceso se habilita escribiendo a fv@entia.systems.

El rechazo es HTTP 403 y no lleva reto de autenticación

A diferencia del resto de tools cerradas, esta no devuelve WWW-Authenticate: no es un problema de credencial que el cliente pueda resolver reautenticándose, y por eso no se le invita a intentarlo. El cuerpo trae error: "dpa_required" y el contacto.

La respuesta va minimizada por diseño

El servidor elimina nombre y apellidos antes de responder y lo declara. Devuelve la verificación colegial, no un expediente de la persona.

Muchos clientes MCP la ocultarán

Los conectores que aplican permisos por herramienta pueden bloquearla en el cliente antes de que salga la petición. Medido en un cliente real: requires additional permissions.

Tier mínimo
ENTERPRISE
Credencial
obligatoria
Caché de edge
600 s
Timeout
20 s
Origen
/api/v1/v3/professional_lookup

05Errores

Dos niveles: protocolo y herramienta. Confundirlos es el primer error de integración.

Hay dos niveles y conviene no confundirlos. Los errores de protocolo viajan en el campo error de JSON-RPC. Los errores de herramienta viajan como un resultado correcto con isError: true y un JSON dentro del texto — así lo prescribe la especificación de MCP, para que el modelo pueda leer el error y corregirse.

CódigoNivelCuándoHTTP
-32700protocoloJSON mal formado.HTTP 200
-32600protocoloLa petición no es JSON-RPC válido.HTTP 200
-32601protocoloMétodo desconocido.HTTP 200
-32602protocoloHerramienta desconocida, o argumentos inválidos. El campo data trae errors[], el inputSchema completo y un enlace a esta página.HTTP 200
API key requiredherramientaFalta credencial en una herramienta que la exige. El cuerpo trae required_tier y checkout_url.HTTP 401 + WWW-Authenticate
tier_restrictedherramientaCredencial válida, pero de un plan que no abre esa herramienta.HTTP 200
dpa_requiredherramientaLa herramienta trata datos personales y exige acuerdo de encargo firmado.HTTP 403, sin reto de autenticación
tier_verification_unavailableherramientaNo se pudo confirmar el plan de la clave contra el origen. Se cierra en falso: deniega.HTTP 200

Un error de validación se puede corregir sin salir del protocolo

Error REAL medido el 2026-08-27json-rpc
{
  "jsonrpc": "2.0",
  "id": 8,
  "error": {
    "code": -32602,
    "message": "Invalid arguments for 'search_entities': missing required argument 'q'",
    "data": {
      "tool": "search_entities",
      "errors": [
        "missing required argument 'q'"
      ],
      "inputSchema": {
        "...": "el esquema completo, tal cual"
      },
      "docs": "https://entia.systems/mcp-docs"
    }
  }
}

El servidor devuelve el esquema entero en el propio error. Un agente puede releerlo y reintentar sin que nadie le pase documentación por fuera.

El reto de autenticación

Cabecera REAL medida el 2026-08-27http
HTTP/2 401
www-authenticate: Bearer error="invalid_token",
  error_description="Authentication required for this tool",
  resource_metadata="https://mcp.entia.systems/.well-known/oauth-protected-resource/mcp",
  scope="mcp"

La combinación es deliberada: el 401 en el transporte es lo que hace que un cliente MCP descubra el servidor de autorización y arranque el flujo de OAuth; el 402 dentro del cuerpo es lo que le dice a un humano qué plan abre esa herramienta. Sin el 401, ningún cliente encontraría la metadata; sin el cuerpo, nadie sabría el precio.

Limitación conocida, medida y declarada

Hoy una credencial inválida —una clave mal escrita, caducada o revocada— no se distingue de un fallo transitorio: la respuesta es tier_verification_unavailable con retry_after_seconds: 5, y un token OAuth inválido se degrada a llamante anónimo sin emitir reto. Un cliente con reintento automático puede quedarse en bucle contra un error que nunca se va a curar.

Recomendación mientras esto se corrige: trata tier_verification_unavailable como un posible problema de credencial, limita los reintentos a dos y comprueba la clave antes de insistir. Las herramientas abiertas siguen respondiendo con normalidad aunque la clave sea inválida.

06Planes y cuotas

Volumen y capacidad. Los planes se diferencian en las dos cosas.

La cuota se cuenta en entidades consultadas: cada llamada a una herramienta descuenta una. Los planes se diferencian en dos cosas a la vez, y conviene no confundirlas: cuánto volumen tienes y qué herramientas se te abren.

PlanPrecioEntidades/mesAl superarloHerramientas
TRACEgratis100bloqueo6 de 12
EDGE9,90 €/mes10.0000,01 €/llamada3 de 12
SIGNAL29 €/mes500bloqueo9 de 12
BUILD99 €/mes2.500bloqueo10 de 12
INTEGRATE399 €/mes10.0000,15 €/llamada11 de 12
OPERATE1.499 €/mes100.0000,10 €/llamada11 de 12
SCALE · ENTERPRISEcontratadocontratadocontratadohasta 12 de 12

Qué abre cada plan, herramienta por herramienta

HerramientaAcceso mínimoGrupo
entity_lookupAbiertaIdentidad y verificación
search_entitiesAbiertaIdentidad y verificación
verify_vatAbiertaIdentidad y verificación
get_full_dossierINTEGRATE+Identidad y verificación
zone_profileSIGNAL+Contexto y mercado
get_competitorsBUILD+Contexto y mercado
run_risk_auditSIGNAL+Contexto y mercado
get_entia_homeAbiertaCorpus publicado
get_entity_home_projectionSIGNAL+Corpus publicado
get_showcaseAbiertaDescubrimiento y plataforma
get_platform_statsAbiertaDescubrimiento y plataforma
professional_lookupEnterprise + DPADatos personales, bajo contrato
Cómo se calcula esta tabla

6 de las 12 herramientas están abiertas y 6 se abren por plan. Esta tabla se calcula cruzando el minTier que cada herramienta declara en el servidor con el mapa de planes del gateway: son dos ficheros distintos y el generador de esta página aborta si dejan de decir lo mismo.

Comprar

Las dos rutas realesshell
# Alta gratuita TRACE (sin tarjeta)
curl -s -X POST https://api.entia.systems/api/v1/mcp/register \
  -H 'Content-Type: application/json' -d '{"email":"tu@empresa.com"}'

# Checkout de un plan de pago -> redirige a Stripe
curl -sI 'https://api.entia.systems/api/v1/mcp/checkout?tier=signal'

Tras el pago, la clave se revela en /mcp-dashboard. SCALE y ENTERPRISE no tienen checkout público: se contratan en fv@entia.systems.

07Procedencia y límites

De dónde sale cada dato y qué es exactamente lo que ENTIA no afirma.

El MCP es una proyección operativa del grafo canónico de identidad económica de ENTIA. Cada respuesta debe poder distinguir dato observado, resolución de entidad, procedencia, estado de verificación y limitaciones. Una Entia Home, la API y MCP son superficies de consumo del mismo activo gobernado; no sustituyen a la fuente ni convierten una inferencia en hecho.

Estados de verificación

EstadoQué significa
VERIFIEDConfirmado contra una fuente registral independiente.
FOUNDLocalizado en el corpus, sin corroboración independiente todavía.
not_foundSe consultó la fuente y no está. Es un resultado, no un error.
not_runNo se consultó esa fuente en esta llamada. Distinto de no encontrar.
PARTIALInsignia agregada: hay corroboración, pero no en todos los ejes.
disclosure_restrictedLa fuente existe y responde, pero el Estado miembro no divulga ese campo.

La diferencia entre not_found y not_run es la que separa una respuesta auditable de una conjetura, y por eso viaja en el payload.

Un valor que no se puede servir se declara

Fragmento REAL de zone_profile, medido el 2026-08-27json
"ratio_paro_vs_declaraciones_pct": {
  "value": null,
  "comparable": false,
  "warning": "source_value_out_of_percent_range_not_served",
  "raw_value": 1895.2
}

Una ratio del 1.895 % no es un porcentaje: es la señal de que numerador y denominador no comparten ámbito geográfico. El servidor podría redondear y entregar algo presentable. Entrega el problema.

Lo que ENTIA NO afirma

El sello de integridad: qué es y qué no es

Algunas respuestas incluyen un sello de integridad calculado sobre el cuerpo de la respuesta. Conviene entender exactamente qué es, porque es fácil leerlo por lo que no es.

Es un código de autenticación de mensaje simétrico, calculado con un secreto que solo tiene ENTIA. Sirve para detectar que una respuesta emitida por ENTIA ha sido modificada, y solo ENTIA puede verificarlo. Al ser simétrico, no distingue emisor de verificador: no prueba el origen frente a un tercero.

No es una firma electrónica. No es un sello electrónico. No es un sello de tiempo. PrecisionAI Marketing OU no es prestador cualificado de servicios de confianza y no figura en ninguna lista de confianza de la Unión Europea. Nada de lo que devuelve esta API constituye por sí mismo prueba oponible frente a terceros. Si tu caso de uso necesita efectos jurídicos cualificados, escríbenos antes de integrar en vez de deducirlo de un campo.

Tamaño y cobertura del corpus

Esta documentación no publica una cifra operacional congelada. El estado actual se obtiene desde get_platform_stats, de modo que integraciones y documentación consultan la misma superficie de runtime:

Estado actual, reproducibleshell
curl -s -X POST https://mcp.entia.systems/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_platform_stats","arguments":{}}}'
No duplicar métricas

Las cifras que aparecen dentro de respuestas de ejemplo son snapshots fechados, no constantes del producto. Para cobertura actual, países, fuentes o tamaño de corpus, consulta get_platform_stats en el momento de uso.

08Versionado y retiradas

Qué rompe, qué no, y dónde siguen vivas las herramientas retiradas.

Una herramienta retirada no es una herramienta borrada. Se retira de la superficie pública cuando deja de cumplir el criterio de que todo lo listado responde correctamente con parámetros válidos; el dato sigue accesible por otro camino.

HerramientaRetiradaPor quéDónde sigue viva
ai_ready_profile2026-08-17roadmap_status_fails_directory_review/api/v1/v3/ai_ready_profile
borme_lookup2026-06-15El enlace sintético por CIF no era fiable en la cola larga: BORME no publica el CIF.Vía entity_lookup y get_full_dossier
lookup_by_domain2026-07-23Retirada de la superficie pública.Vía entity_lookup

Qué se considera un cambio que rompe

Cambio¿Rompe?
Añadir una herramientaNo
Añadir un campo a una respuestaNo. Ignora los campos que no conozcas.
Añadir un parámetro opcionalNo
Añadir un alias de sector al enumNo
Quitar o renombrar un campoSí
Hacer requerido un parámetro que era opcionalSí
Retirar una herramientaSí, y se anuncia en esta tabla
Cambiar el tier mínimo de una herramientaSí para quien esté por debajo

La versión del servidor viaja en cada saludo: serverInfo.version. Hoy, 1.1.2-worker.

09Seguridad

Solo lectura, datos personales bajo contrato y postura ante inyección por herramientas.

Todas las herramientas son de solo lectura

Las 12 declaran readOnlyHint: true, destructiveHint: false e idempotentHint: true. Ninguna escribe, ninguna borra y ninguna dispara efectos en sistemas de terceros. Un agente puede invocarlas sin permiso de escritura.

Datos personales

El servidor trata personas jurídicas. La única excepción es professional_lookup, que verifica colegiación de personas físicas y por eso exige tier Enterprise y acuerdo de encargo de tratamiento firmado. Su respuesta va minimizada por diseño: se eliminan nombre y apellidos antes de responder, y la minimización se declara en el propio payload.

Inyección a través de herramientas

El contenido que devuelven las herramientas procede de registros públicos y de páginas de terceros —por ejemplo el análisis de un dominio en run_risk_audit—. Trátalo como datos, nunca como instrucciones. Si tu agente encadena esa salida hacia acciones con efectos, ponle una barrera de confirmación en medio: es la práctica correcta con cualquier servidor MCP, incluido este.

Residencia y responsable

Operado por PrecisionAI Marketing OÜ, Sepapaja tn 4, 11415 Tallin, Estonia. Código de registro mercantil 17048063. Infraestructura en la Unión Europea.

10Preguntas

¿Necesito una clave para empezar?

No. 6 de las 12 herramientas responden sin credencial, tres de ellas con la respuesta reducida y declarándolo. La clave TRACE es gratuita y se pide por correo desde la API.

¿Qué revisión del protocolo MCP sirve el servidor?

2024-11-05. El servidor no negocia: responde esa revisión aunque el cliente pida otra.

¿Por qué recibo un 401 si mi cliente no usa OAuth?

Porque el 401 con WWW-Authenticate es lo que permite a un cliente MCP descubrir el servidor de autorización. Si usas clave de API, basta con añadir la cabecera X-ENTIA-Key y el 401 desaparece.

¿Cuántos campos devuelve get_full_dossier?

Depende de la entidad. El propio documento trae _meta.fields_populated con el recuento de esa respuesta. Cualquier cifra fija que veas por ahí es una foto de una entidad concreta, no una constante.

¿La caché me puede devolver un dato viejo?

Sí, y te lo dice. Las herramientas con caché de servidor traen _cached_at y _cache_ttl. La más larga es get_full_dossier, con siete días.

¿Se puede usar el corpus para entrenar modelos?

No bajo estos planes. El acceso por API y MCP es para consulta en tiempo de inferencia. La minería de textos y datos y el entrenamiento requieren licencia aparte: tdm-policy.json.

Si un modelo no puede verificar a una empresa, no la va a recomendar.

Conectar cuesta una línea de configuración, y las herramientas abiertas responden ahora mismo, sin registro.

Generada desde services/mcp-ts/src/index.js y core/mcp/plans.py por scripts/docs/build_api_mcp_docs.py. Servidor 1.1.2-worker · protocolo 2024-11-05 · 12 herramientas. Respuestas de ejemplo medidas el 2026-08-27 contra producción.
La autoridad sobre esta página es tools/list en vivo. Si algo no coincide, manda el servidor.