🤖

API y servidor MCP

Consulta los contratos públicos de Melilla desde tus propios programas o pídeselo a tu asistente de inteligencia artificial. Los mismos datos que ves en la web, sin entrar en ella.

GratuitoSolo lecturaClave personal por TelegramDNI de personas enmascarados

¿Qué es esto?

Una API es una puerta para programas: en lugar de una página para leer, tu programa pide una dirección web y recibe los datos ordenados en formato JSON, listos para guardarlos en una hoja de cálculo o cruzarlos con otros. Sirve, por ejemplo, para vigilar cada día los contratos de una consejería o montar tu propio análisis.

Un servidor MCP hace lo mismo para asistentes de inteligencia artificial como Claude. MCP (Model Context Protocol) es el idioma común con el que esos asistentes consultan fuentes externas. Lo conectas una vez y puedes preguntarle en lenguaje normal, por ejemplo: «¿qué contratos de limpieza adjudicó Educación en 2025 y a quién?». El asistente buscará aquí y te dará las direcciones de las fichas para que lo compruebes.

Las dos son de solo lectura y muestran exactamente lo que muestra la web. Si lo que quieres es la base de datos entera de una vez, tienes los datos abiertos en CSV.

Cómo conseguir tu clave

Cada persona usa su propia clave, una contraseña larga que empieza por cmk_. Es gratis, no hay que pedir permiso y se consigue en el bot de Telegram @ContratosMelillaBot, el mismo de las alertas. No hace falta suscribirse a las alertas.

/clave

Te da tu clave. Si ya tienes una, te recuerda cómo empieza (la clave completa solo se muestra al crearla).

/clave_nueva

Anula tu clave y te da otra. Úsalo si la pierdes o crees que alguien la ha visto.

/clave_baja

Anula tu clave. Deja de funcionar al momento.

  • Los comandos solo funcionan en un chat privado con el bot, nunca en un grupo: en un grupo la clave la leería todo el mundo.
  • Como mucho 5 claves nuevas por hora en cada chat.
  • La clave se muestra una sola vez. Guárdala en un lugar seguro y no la compartas. Si se te escapa, /clave_nueva la sustituye.

Límites

Cada clave puede hacer 60 peticiones por minuto, sumando las de la API y las del servidor MCP: es un solo contador por clave. Si te pasas, la respuesta es un error 429 con la cabecera Retry-After, que dice cuántos segundos esperar. Cada respuesta correcta trae X-RateLimit-Remaining con las peticiones que te quedan en ese minuto.

Para frenar a quien prueba claves al azar, una misma conexión que falla la clave 30 veces queda bloqueada hasta que pasa un minuto desde el primer fallo.

Las cinco consultas

Todas usan el método GET y llevan la clave en la cabecera Authorization: Bearer cmk_… (cambia cmk_… por tu clave). En los ejemplos se usa curl, un programa de la terminal; cualquier lenguaje sirve. Donde pone {slug}, pon el último tramo de la url de la ficha: para https://contratosmelilla.es/contrato/abc sería abc.

La descripción técnica completa, en formato OpenAPI, está en /api/v1/openapi.json (no necesita clave). Muchas herramientas la leen directamente.

Buscar contratos

GET /api/v1/contratos

La búsqueda de /buscar: contratos menores y mayores, con los mismos filtros. Sin parámetros devuelve los más recientes.

curl -H "Authorization: Bearer cmk_…" "https://contratosmelilla.es/api/v1/contratos?query=limpieza&anio=2025&tipo=menor&limit=5"

Ficha de un contrato

GET /api/v1/contratos/{slug}

Lo que muestra la ficha /contrato/…: importes, fechas, órgano, adjudicatarios, documentos y señales de riesgo.

curl -H "Authorization: Bearer cmk_…" "https://contratosmelilla.es/api/v1/contratos/{slug}"

Ficha de una empresa

GET /api/v1/empresas/{slug}

Lo que muestra la ficha /empresa/…: total adjudicado y sus contratos, de 25 en 25.

page: Página de la lista de contratos de la ficha (25 por página). Entero desde 1 (por defecto 1).

curl -H "Authorization: Bearer cmk_…" "https://contratosmelilla.es/api/v1/empresas/{slug}?page=1"

Ficha de un órgano de contratación

GET /api/v1/organos/{slug}

Lo que muestra la ficha /organo/…: total adjudicado y sus contratos, de 25 en 25.

page: Página de la lista de contratos de la ficha (25 por página). Entero desde 1 (por defecto 1).

curl -H "Authorization: Bearer cmk_…" "https://contratosmelilla.es/api/v1/organos/{slug}?page=1"

Novedades

GET /api/v1/novedades

Los últimos movimientos de /novedades: contratos nuevos, adjudicaciones y documentos.

limit: Número de entradas. Entero, por defecto 50, máximo 50.

curl -H "Authorization: Bearer cmk_…" "https://contratosmelilla.es/api/v1/novedades?limit=10"

Parámetros de la búsqueda de contratos

/api/v1/contratos admite los mismos filtros que el buscador. Todos son opcionales y se combinan entre sí. A diferencia de la web, un parámetro desconocido, repetido o mal escrito no se ignora: devuelve un error 400 que dice cuál es, para que sepas que tu búsqueda no era la que pediste. Un DNI/NIE en cualquier parámetro devuelve un error 400.

ParámetroQué filtraValores
queryPalabras del objeto del contrato (lo que se contrata).Texto de 1 a 200 caracteres. Sin DNI/NIE ni 7 cifras seguidas
idExpedienteNúmero de expediente.Texto de 1 a 200 caracteres
organoIdÓrgano de contratación, por su identificador.UUID
adjudicatarioNombre (o parte del nombre) de quien ganó el contrato.Texto de 1 a 200 caracteres
unidadUnidad que tramitó el contrato.Texto de 1 a 200 caracteres
cifCIF de una empresa (persona jurídica).CIF de persona jurídica; un DNI/NIE da error
anioAño.4 cifras, por ejemplo 2025
trimestreTrimestre del año.1, 2, 3 o 4
tipoContratos menores, mayores o todos.menor, mayor o todos (por defecto todos)
tipoContratoTipo de contrato.Texto de 1 a 200 caracteres, por ejemplo Servicios, Suministros u Obras
urgenciaTramitación.ordinaria, urgente o emergencia
financiacionUeCon o sin fondos europeos.true o false
anomaliasSeñales de riesgo que debe tener el contrato. Se puede repetir.Hasta 10, entre: licitador_unico, nocturno, previa_informe, tramitacion_express, sin_tablon, riesgo_alto, precio_apurado_limite, precio_apurado_3_ofertas
cpvCódigo CPV (clasificación europea de lo que se compra) o su comienzo.De 1 a 8 cifras
procedimientoProcedimiento de adjudicación.Texto de 1 a 200 caracteres
estadoEstado del expediente.Texto de 1 a 200 caracteres, por ejemplo ADJ o RES
sortOrden: por fecha, importe o riesgo.date, amount, risk (por defecto date)
dirSentido del orden; solo cuenta junto a sort.asc o desc (por defecto desc)
pagePágina de resultados.Entero desde 1 (por defecto 1)
limitResultados por página.Entero, por defecto 20, máximo 50

La respuesta trae data (los contratos) y paginacion (página, resultados por página, total y número de páginas).

Errores

Un error siempre tiene la misma forma, con un código fijo y un mensaje en español:

{ "error": { "code": "VALIDATION", "message": "Parámetro no válido: anio." } }
400 VALIDATIONUn parámetro desconocido, repetido o con un valor no válido, o un DNI/NIE en cualquier parámetro de consulta (los de la URL tras «?»).
401 API_KEY_REQUIREDFalta la cabecera Authorization: Bearer cmk_….
401 API_KEY_INVALIDLa clave no existe o está anulada.
404 NOT_FOUNDEsa ficha no existe o no es pública.
429 RATE_LIMITEDMás de 60 peticiones por minuto con la misma clave, o demasiados intentos fallidos desde la misma conexión. La cabecera Retry-After dice cuántos segundos esperar.
500 INTERNALError del servidor. Prueba más tarde.

Cita la fuente

Cada contrato, empresa, órgano o novedad lleva un campo url con su dirección en esta web. Úsalo para citar la fuente y para que tus lectores lo comprueben. Si publicas algo hecho con estos datos, cita ContratosMelilla.es con ese enlace. Las fichas de contrato traen además enlaceOficial, el enlace a la publicación oficial.

Servidor MCP para asistentes de IA

La dirección del servidor es:

https://contratosmelilla.es/mcp

Usa la misma clave y el mismo límite que la API. Tu asistente verá estas herramientas, cada una equivalente a una consulta de la API:

  • buscar_contratosBuscar contratos
  • ver_contratoVer un contrato
  • ver_empresaVer una empresa
  • ver_organoVer un órgano de contratación
  • novedadesNovedades

Claude Code

Escribe en la terminal (con tu clave en lugar de cmk_…):

claude mcp add --transport http contratosmelilla https://contratosmelilla.es/mcp --header "Authorization: Bearer cmk_…"

Claude Desktop y otros asistentes

Los conectores remotos de Claude Desktop y de claude.ai se identifican con OAuth, un sistema de inicio de sesión que este servidor no usa: aquí basta la clave. Para usarlo desde un programa instalado en tu ordenador hace falta un pequeño puente, mcp-remote, que necesita Node.js y añade la clave a cada petición:

npx mcp-remote https://contratosmelilla.es/mcp --header "Authorization: Bearer ${CLAVE}"

En Claude Desktop se configura en su archivo de configuración, dentro de mcpServers:

{
  "mcpServers": {
    "contratosmelilla": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "https://contratosmelilla.es/mcp",
        "--header",
        "Authorization: Bearer ${CLAVE}"
      ],
      "env": {
        "CLAVE": "cmk_…"
      }
    }
  }
}

En Windows, si el puente no conecta, prueba a escribir la cabecera sin espacios (Authorization:${CABECERA}, con CABECERA = "Bearer cmk_…" en env), como explican las instrucciones de mcp-remote. La versión web de claude.ai no puede ejecutar este puente.

⚠️

Lo que preguntes y lo que el servidor responda pasa también por la empresa que ofrece tu asistente de IA. Y comprueba siempre lo que te diga el asistente en la ficha de la web: puede equivocarse al resumir.

Privacidad

Son datos de contratos del sector público. La API y el servidor MCP muestran exactamente lo mismo que la web, con la misma protección: el DNI/NIE de las personas físicas (autónomos, por ejemplo) aparece enmascarados igual que en sus fichas. Los CIF de empresas son públicos y se muestran completos.

No hay otra forma de obtener datos sin enmascarar: ni la clave, ni un parámetro, ni el servidor MCP dan acceso a más de lo que muestra la web. No escribas DNI/NIE en las búsquedas: se rechazan, y la dirección de una petición puede quedar guardada en registros técnicos.

Qué guardamos de tu clave y para qué lo cuenta la política de privacidad.

Uso de cookies: Utilizamos cookies analíticas para entender cómo usas el portal y mejorar la experiencia. También usamos Umami, una herramienta de analíticas self-hosted sin cookies y sin terceros, que recopila métricas anónimas de navegación. No recopilamos datos personales identificables. Puedes aceptar, rechazar o personalizar tu consentimiento. Más información