Skip to content

Servidor MCP

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/
DatoValor
URLhttps://mcp.normatia.com/mcp/
TransporteStreamable HTTP (en las configuraciones suele llamarse http)
AutenticaciónOAuth, si tu cliente lo admite, o tu clave en la cabecera Authorization: Bearer sk-normatia-...

Primero los datos, luego la interpretación

Section titled “Primero los datos, luego la interpretación”

El servidor tiene dos clases de herramientas, y el asistente las usa en ese orden:

  • Datos, gratis y deterministas. La parcela por su referencia catastral o por coordenadas, con cada capa de afección y su planeamiento; el municipio con su zona climática, su sismicidad o su zona de viento, cada dato con la norma de donde sale; el catálogo de normativa y el texto de cada sección. Son las mismas rutas de la API REST, con el mismo JSON.
  • 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.

HerramientaQué haceParámetrosCoste
find_parcelLa parcela que contiene un punto (o las más cercanas)lat, lonGratis
get_parcelUna parcela: municipio, clase, superficie, portales y, con include, afecciones, planeamiento, edificación, inmuebles y geometríaref, includeGratis
get_placeUn municipio, provincia o comunidad, con sus datos técnicos y cuántas normas le aplicanplace (nombre, código INE o ES-…)Gratis
search_regulationsBuscar normas por título, ámbito o municipioquery, place, scope, curated, limitGratis
get_regulation_contentsEl índice de una norma: sus seccionesregulation, versionGratis
read_regulation_sectionEl texto de una sección, artículo a artículoregulation, section, version, from_blockGratis
askUna pregunta interpretada por el motor, con citasquery y un alcance: project_id, place o parcel1 consulta
get_answerRecoge una consulta de ask que seguía en marchaanswer_idGratis
list_projectsTus proyectos en la organización, con su project_idningunoGratis
get_project_infoEl contexto de un proyecto: ubicación, normativa aplicable, archivos, memoria y cálculosproject_idGratis
get_usageLas llamadas y consultas gastadas, y las que quedan este mesfrom_date, to_dateGratis

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 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:

AlcanceQué consulta
project_id, o nadaUn proyecto tuyo (el activo si no se indica): su normativa seleccionada, sus documentos subidos, su memoria y sus cálculos
placeUn municipio, sin proyecto: la normativa que le aplica, de la estatal a la municipal, y sus datos técnicos
parcelUna 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 web

Si 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.

  1. Ve a Customize > Connectors.

  2. Pulsa + Add y luego Add custom connector.

  3. Escribe un nombre (por ejemplo, Normatia) y la URL https://mcp.normatia.com/mcp/, y pulsa Continue.

  4. 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-....

  5. 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.

  1. Activa el modo desarrollador: Settings > Apps > Advanced settings > Developer mode.

  2. Pulsa Create app.

  3. Introduce la URL https://mcp.normatia.com/mcp/ y elige OAuth como autenticación.

  4. Pulsa Create e inicia sesión en Normatia cuando te lo pida.

Con OAuth:

Terminal window
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:

Terminal window
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ónValor
TransporteStreamable HTTP
URLhttps://mcp.normatia.com/mcp/
Cabecera de autenticaciónAuthorization: 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.

  • El servidor admite 60 peticiones por minuto por clave. Además, ask está sujeta a la cuota del mes y al límite por minuto del plan de la organización. Ver Autenticación.
  • Si la clave falta, no es válida o ha caducado, el servidor responde 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.
  • Un error de una herramienta (una parcela que no existe, un municipio ambiguo, la cuota agotada) llega como resultado con 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:

  • “¿Qué afecciones tiene la parcela 6963301TG3466N y en qué zona de planeamiento está?”
  • “¿Cuál es la zona climática y la sobrecarga de nieve de Alcalá de Henares, y de qué norma sale cada dato?”
  • “Lee el artículo del CTE DB-HE sobre el ámbito de aplicación de la sección HE 0”
  • “¿Se puede añadir una planta en la parcela 6963301TG3466N según la normativa de Sevilla?”
  • “¿Qué normativa tengo activa en mi proyecto y de qué año es cada edición?”
  • “¿Qué transmitancia máxima puedo poner en las ventanas de mi proyecto?”
  • “Revisa la memoria de carpintería adjunta y dime si los valores cumplen”
  • “¿Qué altura libre mínima me exige la ordenanza municipal en el proyecto de Sevilla?”
  • “Compara los requisitos de accesibilidad de mi proyecto de Madrid con el de Bilbao”
  • “¿Qué dice la normativa sobre ventilación del garaje, teniendo en cuenta los cálculos que ya guardé?”

Una parcela, de los datos a la norma

  1. find_parcel(lat, lon) o directamente get_parcel(ref).
  2. search_regulations(place=...) y read_regulation_section(...) para el artículo que regula su zona.
  3. ask("...", parcel=ref) si hace falta interpretar.

Consulta sobre el proyecto activo

  1. ask("..."), sin más: el proyecto activo se resuelve solo.
  2. Llama a get_project_info() solo si necesitas ver la ubicación, las versiones vigentes o lo que hay guardado.

Comparativa entre municipios

  1. list_projects() para obtener los project_id.
  2. ask("...", project_id=A) y ask("...", project_id=B).
  3. Contrasta las respuestas, sin tocar el proyecto activo.

Las mismas capacidades están disponibles como API REST para integraciones propias:

En el repositorio de código abierto github.com/normatia/normatia están:

  • Los SDK de TypeScript y Python.

  • Las configuraciones listas para cada cliente, en mcp/, y un instalador que las escribe por ti (Claude Code, Cursor, VS Code, Windsurf y OpenCode):

    Terminal window
    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).