Una parcela, de los datos a la norma
find_parcel(lat, lon)o directamenteget_parcel(ref).search_regulations(place=...)yread_regulation_section(...)para el artículo que regula su zona.ask("...", parcel=ref)si hace falta interpretar.
Normatia tiene un servidor MCP remoto que da a los asistentes de IA (Claude, ChatGPT, Cursor, VS Code…) la misma API de Normatia, sin instalar nada: las parcelas con sus afecciones y su planeamiento, los municipios con sus datos técnicos, el texto de la normativa y el motor que la interpreta para tus proyectos.
https://mcp.normatia.com/mcp/| Dato | Valor |
|---|---|
| URL | https://mcp.normatia.com/mcp/ |
| Transporte | Streamable HTTP (en las configuraciones suele llamarse http) |
| Autenticación | OAuth, si tu cliente lo admite, o tu clave en la cabecera Authorization: Bearer sk-normatia-... |
El servidor tiene dos clases de herramientas, y el asistente las usa en ese orden:
ask, el motor que interpreta. Una pregunta en lenguaje natural sobre un proyecto, un municipio o una parcela, que el motor agéntico de Normatia responde buscando en la normativa aplicable y citando cada fuente. Gasta una consulta.Dos reglas que el servidor le da al asistente: una capa con no_data es desconocida, nunca «no afecta», y el texto de una norma con curated: false está convertido de forma automática y sin revisar, así que hay que decirlo y contrastarlo con su original.
| Herramienta | Qué hace | Parámetros | Coste |
|---|---|---|---|
find_parcel | La parcela que contiene un punto (o las más cercanas) | lat, lon | Gratis |
get_parcel | Una parcela: municipio, clase, superficie, portales y, con include, afecciones, planeamiento, edificación, inmuebles y geometría | ref, include | Gratis |
get_place | Un municipio, provincia o comunidad, con sus datos técnicos y cuántas normas le aplican | place (nombre, código INE o ES-…) | Gratis |
search_regulations | Buscar normas por título, ámbito o municipio | query, place, scope, curated, limit | Gratis |
get_regulation_contents | El índice de una norma: sus secciones | regulation, version | Gratis |
read_regulation_section | El texto de una sección, artículo a artículo | regulation, section, version, from_block | Gratis |
ask | Una pregunta interpretada por el motor, con citas | query y un alcance: project_id, place o parcel | 1 consulta |
get_answer | Recoge una consulta de ask que seguía en marcha | answer_id | Gratis |
list_projects | Tus proyectos en la organización, con su project_id | ninguno | Gratis |
get_project_info | El contexto de un proyecto: ubicación, normativa aplicable, archivos, memoria y cálculos | project_id | Gratis |
get_usage | Las llamadas y consultas gastadas, y las que quedan este mes | from_date, to_date | Gratis |
Todas son de solo lectura salvo ask, que guarda su conversación. El servidor no genera documentos, no edita y no guarda en la memoria del proyecto.
Cada herramienta declara su esquema de salida (outputSchema) y devuelve el mismo JSON que la API en structuredContent, más un resumen en texto, que es lo que lee el modelo en los clientes que no usan el resultado estructurado.
ask, el motor agénticoask ejecuta el mismo bucle agéntico que el chat de normatia.com: el modelo decide qué buscar, encadena varias búsquedas y redacta la respuesta citando sus fuentes con marcadores [N] validados contra los fragmentos recuperados. Las reglas de precedencia normativa y de citación son las mismas que en el chat web.
Se le da un alcance, como mucho uno:
| Alcance | Qué consulta |
|---|---|
project_id, o nada | Un proyecto tuyo (el activo si no se indica): su normativa seleccionada, sus documentos subidos, su memoria y sus cálculos |
place | Un municipio, sin proyecto: la normativa que le aplica, de la estatal a la municipal, y sus datos técnicos |
parcel | Una parcela, sin proyecto: la normativa de su municipio, sus afecciones y su planeamiento |
ask y get_project_info aceptan un project_id opcional. El orden de resolución es:
project_id explícito → proyecto activo del usuario en la webSi preguntas por otro proyecto, el asistente llama a list_projects, toma el project_id que corresponda y lo pasa a ask. No hace falta cambiar el proyecto activo en la web: se pueden consultar varios proyectos en la misma conversación. Si no tienes proyecto en ese municipio, el asistente usa place o parcel, nunca la normativa de otro proyecto.
Un project_id de otra organización recibe la misma respuesta que uno inexistente.
En claude.ai y en la aplicación de escritorio, los servidores remotos se añaden como conector personalizado desde la configuración de tu cuenta, no en claude_desktop_config.json (ese archivo es solo para servidores locales). El conector que añades en claude.ai aparece también en Claude Desktop.
Ve a Customize > Connectors.
Pulsa + Add y luego Add custom connector.
Escribe un nombre (por ejemplo, Normatia) y la URL https://mcp.normatia.com/mcp/, y pulsa Continue.
En la autenticación, elige iniciar sesión con OAuth. Si te pregunta por el cliente OAuth, elige Register automatically. Si prefieres usar una clave, elige no iniciar sesión y añade una cabecera de petición Authorization con el valor Bearer sk-normatia-....
Pulsa Add e inicia sesión en Normatia cuando te lo pida.
En los planes Team y Enterprise, el propietario lo añade desde Organization settings > Connectors (Add, Custom, Web) y cada miembro lo conecta después desde Customize > Connectors. Si el propietario pone una clave en las cabeceras, todos los miembros usan esa misma clave; con OAuth, cada uno entra con su cuenta.
Activa el modo desarrollador: Settings > Apps > Advanced settings > Developer mode.
Pulsa Create app.
Introduce la URL https://mcp.normatia.com/mcp/ y elige OAuth como autenticación.
Pulsa Create e inicia sesión en Normatia cuando te lo pida.
Con OAuth:
claude mcp add --transport http normatia https://mcp.normatia.com/mcp/Después, dentro de Claude Code, ejecuta /mcp, elige normatia y sigue el inicio de sesión en el navegador.
Con clave:
claude mcp add --transport http normatia https://mcp.normatia.com/mcp/ \ --header "Authorization: Bearer sk-normatia-..."Crea .vscode/mcp.json en tu espacio de trabajo. Con OAuth, basta con la URL; VS Code abre el inicio de sesión la primera vez que arranca el servidor:
{ "servers": { "normatia": { "type": "http", "url": "https://mcp.normatia.com/mcp/" } }}Con clave, VS Code te la pide al arrancar y la guarda cifrada, sin dejarla en el archivo:
{ "inputs": [ { "type": "promptString", "id": "normatia-api-key", "description": "Clave de API de Normatia (sk-normatia-...)", "password": true } ], "servers": { "normatia": { "type": "http", "url": "https://mcp.normatia.com/mcp/", "headers": { "Authorization": "Bearer ${input:normatia-api-key}" } } }}Para tenerlo en todos tus proyectos, añade lo mismo a la configuración de usuario con el comando MCP: Open User Configuration.
Añade a ~/.cursor/mcp.json (para todos los proyectos) o a .cursor/mcp.json (para uno):
{ "mcpServers": { "normatia": { "url": "https://mcp.normatia.com/mcp/", "headers": { "Authorization": "Bearer sk-normatia-..." } } }}Añade a ~/.codeium/windsurf/mcp_config.json:
{ "mcpServers": { "normatia": { "serverUrl": "https://mcp.normatia.com/mcp/", "headers": { "Authorization": "Bearer sk-normatia-..." } } }}Añade a tu opencode.json:
{ "$schema": "https://opencode.ai/config.json", "mcp": { "normatia": { "type": "remote", "url": "https://mcp.normatia.com/mcp/", "enabled": true, "headers": { "Authorization": "Bearer sk-normatia-..." } } }}Sin headers, OpenCode intenta el inicio de sesión con OAuth (opencode mcp auth normatia).
Añade a la configuración de Zed (settings.json):
{ "context_servers": { "normatia": { "url": "https://mcp.normatia.com/mcp/", "headers": { "Authorization": "Bearer sk-normatia-..." } } }}| Configuración | Valor |
|---|---|
| Transporte | Streamable HTTP |
| URL | https://mcp.normatia.com/mcp/ |
| Cabecera de autenticación | Authorization: Bearer sk-normatia-... |
| OAuth (alternativa a la cabecera) | Autorización con código y PKCE (S256), con registro dinámico de clientes y renovación (refresh_token). Metadatos en https://mcp.normatia.com/.well-known/oauth-authorization-server |
Al conectar, la pantalla de Normatia dice qué podrá hacer el asistente: leer datos siempre y, si dejas marcada la casilla, hacer consultas que gastan el cupo de tu organización. Sin la casilla, el asistente solo ve las herramientas de datos. Para cambiarlo, desconéctalo y vuelve a conectarlo. Los permisos que se pueden pedir (scope) son mcp, data y ask; ver Permisos.
El token de acceso que obtiene el cliente por OAuth dura una hora. El cliente lo renueva solo, sin volver a pedirte permiso, con un token de renovación que dura 30 días y cambia en cada uso: si alguien presentara uno ya gastado, Normatia cierra la conexión entera.
Cada asistente conectado aparece en Mi cuenta, apartado Aplicaciones conectadas, con su último uso y un botón para desconectarlo.
ask está sujeta a la cuota del mes y al límite por minuto del plan de la organización. Ver Autenticación.401 con la cabecera WWW-Authenticate y un cuerpo {"error": "...", "message": "..."}; si la clave no existe, solo {"error": "invalid_api_key"}. Si el servicio de autenticación no responde, 503 auth_error: reintenta. Si la organización de la clave no tiene el MCP activado, responde 403 mcp_not_enabled, y si la clave no tiene el permiso mcp, 403 insufficient_scope.isError, con su código, el mensaje y qué hacer: «Error 404 (parcel_not_found): … Comprueba la referencia o búscala por coordenadas con find_parcel». Los códigos son los de la API.Una vez conectado, prueba estas preguntas en tu asistente:
Una parcela, de los datos a la norma
find_parcel(lat, lon) o directamente get_parcel(ref).search_regulations(place=...) y read_regulation_section(...) para el artículo que regula su zona.ask("...", parcel=ref) si hace falta interpretar.Consulta sobre el proyecto activo
ask("..."), sin más: el proyecto activo se resuelve solo.get_project_info() solo si necesitas ver la ubicación, las versiones vigentes o lo que hay guardado.Comparativa entre municipios
list_projects() para obtener los project_id.ask("...", project_id=A) y ask("...", project_id=B).Las mismas capacidades están disponibles como API REST para integraciones propias:
GET /v1/parcels, GET /v1/places y GET /v1/regulations: las herramientas de datos.POST /api/v2/ask: la consulta agéntica que hay detrás de la herramienta ask (con proyecto).GET /api/v1/projects y GET /api/v1/project/info: el contexto de proyecto.GET /v1/usage: el consumo.En el repositorio de código abierto github.com/normatia/normatia están:
Las configuraciones listas para cada cliente, en mcp/, y un instalador que las escribe por ti (Claude Code, Cursor, VS Code, Windsurf y OpenCode):
bash <(curl -fsSL https://raw.githubusercontent.com/normatia/normatia/main/mcp/install.sh)Los ejemplos y las skills para asistentes.
El servidor está también en el MCP Registry, el registro oficial de servidores MCP, como com.normatia/mcp (versión 1.1.0).