Koskamo

Aerset MCP

An MCP server that provides access to Aerset's live catalog of Spanish drone regulations, allowing agents to query specific rules, permits, and airspace restrictions with cited sources and review dates for compliance verification.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Aerset MCP logo, by AersetVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by Aerset
MCP endpoint (Streamable HTTP)
https://mcp.aerset.com/mcp
Vendor documentation

What its tools do

5 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

5 of 5 have a description · 5 of 5 declare behavior hints · 0 of 4 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to aerset.com ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Query specific Spanish drone regulations and permit requirements
  • Verify airspace restrictions and protected area rules
  • Retrieve cited sources and review dates for legal compliance

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
aerset 0.1.0
MCP protocol negotiated in check
2025-11-25
Tools
5 advertised
Resources
0 advertised
Resource templates
0 advertised
Prompts
0 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "prompts": {
    "listChanged": false
  },
  "resources": {
    "subscribe": false,
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Aerset: normativa de drones de España, con fuentes y fechas. Cinco herramientas de solo lectura sobre el corpus normativo, el motor de trámites, las zonas UAS de ENAIRE, los espacios protegidos de MITECO y los puntos de vuelo de la comunidad. ORIENTA y no autoriza: no concede permisos, no tramita nada y no afirma que una operación pueda realizarse. Cita siempre la fuente y su fecha, y manda la decisión operativa a AESA y al visor oficial de ENAIRE. · Spanish drone regulation, sourced and dated. Five read-only tools. It advises and never authorises: quote the source and its date, and send the operational decision to the authority.

Tools

5 advertised

search_regulation — Buscar en la normativa
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Busca en el corpus normativo de drones de España: BOE, Reglamento (UE) 2019/947, guías de AESA y EASA, y MITECO. Devuelve PASAJES literales con el título del documento, su URL y su fecha — no un resumen y no una conclusión. Úsalo para citar la norma con su fuente y su fecha. Lo que no consta en estas fuentes se cita como «en nuestras fuentes no consta X», nunca como una ausencia en el mundo. Para saber qué trámites exige un vuelo concreto, usa `flight_requirements`. · Searches Aerset's sourced corpus of Spanish drone regulation and returns literal passages, each with its document title, URL and vintage. Retrieval only: nothing is summarised and no conclusion is drawn. Quote a passage with its source and its date; an absence from the corpus is an absence from our sources and says nothing about the world.

search_regulation input schema
{
  "type": "object",
  "title": "search_regulationArguments",
  "required": [
    "query"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "title": "Limit",
      "default": 6
    },
    "query": {
      "type": "string",
      "title": "Query"
    }
  }
}
search_regulation output schema
{
  "type": "object",
  "$defs": {
    "Passage": {
      "type": "object",
      "title": "Passage",
      "required": [
        "title",
        "source",
        "text"
      ],
      "properties": {
        "url": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Url",
          "default": null
        },
        "text": {
          "type": "string",
          "title": "Text"
        },
        "title": {
          "type": "string",
          "title": "Title"
        },
        "source": {
          "type": "string",
          "title": "Source"
        },
        "vintage": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Vintage",
          "default": null
        }
      }
    }
  },
  "title": "RegulationAnswer",
  "properties": {
    "note": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Note",
      "default": null
    },
    "query": {
      "type": "string",
      "title": "Query",
      "default": ""
    },
    "passages": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/Passage"
      },
      "title": "Passages"
    },
    "available": {
      "type": "boolean",
      "title": "Available",
      "default": true
    },
    "checked_at": {
      "type": "string",
      "title": "Checked At",
      "format": "date-time"
    },
    "disclaimer": {
      "type": "string",
      "title": "Disclaimer",
      "default": "Orientación con fuentes, no autorización. Aerset no concede permisos ni los tramita. La última palabra la tienen AESA y el visor oficial de ENAIRE, y cada decisión operativa se consulta con la autoridad antes del vuelo."
    },
    "attribution": {
      "type": "string",
      "title": "Attribution",
      "default": "Fuentes: BOE, Reglamento (UE) 2019/947, guías de AESA y EASA, ENAIRE (servAIS, ED-318) y MITECO/IEPNB. Cada pasaje y cada regla lleva la suya con su fecha."
    },
    "corpus_documents": {
      "type": "integer",
      "title": "Corpus Documents",
      "default": 0
    },
    "invalid_arguments": {
      "anyOf": [
        {
          "type": "array",
          "items": {}
        },
        {
          "type": "null"
        }
      ],
      "title": "Invalid Arguments",
      "default": null
    }
  }
}
search_regulation annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
flight_requirements — Trámites que exige un vuelo
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Calcula, con el motor determinista de Aerset, qué trámites exige la normativa para volar en un punto de España, en una fecha y con una aeronave concreta: qué régimen de la categoría abierta aplica por peso y marcado de clase, qué zonas UAS publica ENAIRE sobre el punto, qué espacios protegidos constan en MITECO y quién autoriza cada cosa, con el plazo que el catálogo atribuye a cada trámite. Cada línea nombra la autoridad que la exige y la fuente con su fecha de revisión. NO concede permisos, no tramita nada y no afirma que la operación pueda realizarse: el campo `not_covered` enumera las fuentes que esta respuesta no consulta (NOTAM, terreno, obstáculos, meteo). La decisión es del operador y se consulta con AESA. · Runs Aerset's deterministic permit engine over a point, a date and an aircraft in Spain and returns the requirement list: the open-category regime for that weight and class marking, the UAS zones ENAIRE publishes over the point, the protected areas MITECO records, and who demands each item with the lead time our catalogue attributes to it. It grants nothing and files nothing; `not_covered` names the sources it does not consult, and the decision stays with the operator and the authority.

flight_requirements input schema
{
  "type": "object",
  "title": "flight_requirementsArguments",
  "required": [
    "lat",
    "lon"
  ],
  "properties": {
    "lat": {
      "type": "number",
      "title": "Lat"
    },
    "lon": {
      "type": "number",
      "title": "Lon"
    },
    "date": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Date",
      "default": null
    },
    "night": {
      "type": "boolean",
      "title": "Night",
      "default": false
    },
    "environment": {
      "type": "string",
      "title": "Environment",
      "default": "RURAL"
    },
    "class_marking": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Class Marking",
      "default": null
    },
    "drone_weight_g": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Drone Weight G",
      "default": null
    }
  }
}
flight_requirements output schema
{
  "type": "object",
  "title": "RequirementsAnswer",
  "properties": {
    "lat": {
      "type": "number",
      "title": "Lat",
      "default": 0
    },
    "lon": {
      "type": "number",
      "title": "Lon",
      "default": 0
    },
    "note": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Note",
      "default": null
    },
    "zones": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "title": "Zones"
    },
    "regime": {
      "anyOf": [
        {
          "type": "object",
          "additionalProperties": true
        },
        {
          "type": "null"
        }
      ],
      "title": "Regime",
      "default": null
    },
    "covered": {
      "type": "boolean",
      "title": "Covered",
      "default": true
    },
    "for_date": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "For Date",
      "default": null
    },
    "available": {
      "type": "boolean",
      "title": "Available",
      "default": true
    },
    "checked_at": {
      "type": "string",
      "title": "Checked At",
      "format": "date-time"
    },
    "disclaimer": {
      "type": "string",
      "title": "Disclaimer",
      "default": "Orientación con fuentes, no autorización. Aerset no concede permisos ni los tramita. La última palabra la tienen AESA y el visor oficial de ENAIRE, y cada decisión operativa se consulta con la autoridad antes del vuelo."
    },
    "viewer_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Viewer Url",
      "default": null
    },
    "attribution": {
      "type": "string",
      "title": "Attribution",
      "default": "Fuentes: BOE, Reglamento (UE) 2019/947, guías de AESA y EASA, ENAIRE (servAIS, ED-318) y MITECO/IEPNB. Cada pasaje y cada regla lleva la suya con su fecha."
    },
    "not_covered": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "title": "Not Covered"
    },
    "requirements": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "title": "Requirements"
    },
    "protected_areas": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "title": "Protected Areas"
    },
    "zones_available": {
      "type": "boolean",
      "title": "Zones Available",
      "default": true
    },
    "invalid_arguments": {
      "anyOf": [
        {
          "type": "array",
          "items": {}
        },
        {
          "type": "null"
        }
      ],
      "title": "Invalid Arguments",
      "default": null
    },
    "judged_at_height_m": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Judged At Height M",
      "default": null
    },
    "protected_available": {
      "type": "boolean",
      "title": "Protected Available",
      "default": true
    },
    "nearest_aerodrome_km": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "title": "Nearest Aerodrome Km",
      "default": null
    }
  }
}
flight_requirements annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
uas_zones — Zonas UAS de ENAIRE en un rectángulo
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Devuelve los polígonos de las zonas geográficas UAS que ENAIRE publica dentro de un rectángulo, con el tipo de cada una, sus límites vertical inferior y superior y la fecha en que ENAIRE la actualizó. Es la capa que pinta un mapa, no un veredicto sobre un punto: para eso está `flight_requirements`. Una lista vacía significa que la consulta a ENAIRE no devolvió ninguna zona para ese rectángulo, y `available: false` significa que no se pudo consultar — ni la una ni la otra describen el cielo. El visor oficial de ENAIRE tiene la última palabra. · Returns the UAS geographical zones ENAIRE publishes inside a bounding box, each with its kind, its vertical limits and ENAIRE's own update date. It is a map layer and not a verdict about a point. An empty list means our query to ENAIRE returned nothing for that rectangle; `available: false` means the query did not happen. ENAIRE's official viewer has the last word.

uas_zones input schema
{
  "type": "object",
  "title": "uas_zonesArguments",
  "required": [
    "bbox"
  ],
  "properties": {
    "bbox": {
      "type": "string",
      "title": "Bbox"
    }
  }
}
uas_zones output schema
{
  "type": "object",
  "title": "ZonesAnswer",
  "properties": {
    "note": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Note",
      "default": null
    },
    "zones": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "title": "Zones"
    },
    "available": {
      "type": "boolean",
      "title": "Available",
      "default": true
    },
    "truncated": {
      "type": "boolean",
      "title": "Truncated",
      "default": false
    },
    "checked_at": {
      "type": "string",
      "title": "Checked At",
      "format": "date-time"
    },
    "disclaimer": {
      "type": "string",
      "title": "Disclaimer",
      "default": "Orientación con fuentes, no autorización. Aerset no concede permisos ni los tramita. La última palabra la tienen AESA y el visor oficial de ENAIRE, y cada decisión operativa se consulta con la autoridad antes del vuelo."
    },
    "viewer_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Viewer Url",
      "default": null
    },
    "attribution": {
      "type": "string",
      "title": "Attribution",
      "default": "Fuentes: BOE, Reglamento (UE) 2019/947, guías de AESA y EASA, ENAIRE (servAIS, ED-318) y MITECO/IEPNB. Cada pasaje y cada regla lleva la suya con su fecha."
    },
    "invalid_arguments": {
      "anyOf": [
        {
          "type": "array",
          "items": {}
        },
        {
          "type": "null"
        }
      ],
      "title": "Invalid Arguments",
      "default": null
    }
  }
}
uas_zones annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
spots_near — Puntos de vuelo cerca
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Busca puntos de vuelo cerca de una coordenada, de la comunidad de pilotos de Aerset: nombre, coordenada, tipo de dron al que va bien y la dificultad que se le comprobó, con la fecha de esa comprobación. Es conocimiento de la comunidad y NO una fuente oficial: dice adónde va la gente, no qué exige la norma. Que un punto figure aquí no dice nada sobre el espacio aéreo de hoy — la dificultad es la del día en que se comprobó y no se recalcula—, así que los trámites los contesta `flight_requirements` y la última palabra la tienen AESA y el visor oficial de ENAIRE. · Finds flying spots near a coordinate from Aerset's pilot community, with the difficulty each one was checked at and the date of that check. Community knowledge, not an official source: it says where people go and nothing about what the regulation demands. A spot appearing here says nothing about today's airspace — its difficulty is the day it was checked and is never recomputed — so ask `flight_requirements` for the paperwork, and the authority and ENAIRE's official viewer have the last word.

spots_near input schema
{
  "type": "object",
  "title": "spots_nearArguments",
  "required": [
    "lat",
    "lon"
  ],
  "properties": {
    "lat": {
      "type": "number",
      "title": "Lat"
    },
    "lon": {
      "type": "number",
      "title": "Lon"
    },
    "radius_km": {
      "type": "number",
      "title": "Radius Km",
      "default": 25
    }
  }
}
spots_near output schema
{
  "type": "object",
  "title": "SpotsAnswer",
  "properties": {
    "note": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Note",
      "default": null
    },
    "spots": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "title": "Spots"
    },
    "available": {
      "type": "boolean",
      "title": "Available",
      "default": true
    },
    "checked_at": {
      "type": "string",
      "title": "Checked At",
      "format": "date-time"
    },
    "disclaimer": {
      "type": "string",
      "title": "Disclaimer",
      "default": "Orientación con fuentes, no autorización. Aerset no concede permisos ni los tramita. La última palabra la tienen AESA y el visor oficial de ENAIRE, y cada decisión operativa se consulta con la autoridad antes del vuelo."
    },
    "note_on_verdicts": {
      "type": "string",
      "title": "Note On Verdicts",
      "default": "La dificultad de cada punto es la del día en que se comprobó, y esa fecha viaja con el punto; sin fecha, está sin comprobar. No se recalcula sola."
    },
    "invalid_arguments": {
      "anyOf": [
        {
          "type": "array",
          "items": {}
        },
        {
          "type": "null"
        }
      ],
      "title": "Invalid Arguments",
      "default": null
    }
  }
}
spots_near annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
rules_catalogue — Catálogo de trámites
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Devuelve el catálogo completo de trámites que Aerset mantiene para volar un dron en España, regla a regla: su código, su título, la autoridad que la exige, las condiciones en las que aplica, el plazo que le atribuimos y si ese plazo está comprobado contra la fuente o no, más la URL de la fuente y la fecha en que se revisó. Es el conjunto sobre el que trabaja `flight_requirements`, publicado para poder citarlo entero. Una regla sin `reviewed_at` no dice nada, y con `lead_time_verified: false` el plazo NO está comprobado. · Returns Aerset's whole catalogue of Spanish drone paperwork, rule by rule: code, title, the authority that demands it, the conditions under which it applies, the lead time we attribute to it and whether that lead time has been checked against the source, plus the source URL and the review date. It is the set `flight_requirements` evaluates, published so it can be cited whole.

rules_catalogue input schema
{
  "type": "object",
  "title": "rules_catalogueArguments",
  "properties": {}
}
rules_catalogue output schema
{
  "type": "object",
  "title": "RulesAnswer",
  "properties": {
    "note": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Note",
      "default": null
    },
    "rules": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "title": "Rules"
    },
    "licence": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Licence",
      "default": null
    },
    "available": {
      "type": "boolean",
      "title": "Available",
      "default": true
    },
    "checked_at": {
      "type": "string",
      "title": "Checked At",
      "format": "date-time"
    },
    "disclaimer": {
      "type": "string",
      "title": "Disclaimer",
      "default": "Orientación con fuentes, no autorización. Aerset no concede permisos ni los tramita. La última palabra la tienen AESA y el visor oficial de ENAIRE, y cada decisión operativa se consulta con la autoridad antes del vuelo."
    },
    "attribution": {
      "type": "string",
      "title": "Attribution",
      "default": "Fuentes: BOE, Reglamento (UE) 2019/947, guías de AESA y EASA, ENAIRE (servAIS, ED-318) y MITECO/IEPNB. Cada pasaje y cada regla lleva la suya con su fecha."
    },
    "licence_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Licence Url",
      "default": null
    },
    "reviewed_through": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Reviewed Through",
      "default": null
    },
    "invalid_arguments": {
      "anyOf": [
        {
          "type": "array",
          "items": {}
        },
        {
          "type": "null"
        }
      ],
      "title": "Invalid Arguments",
      "default": null
    }
  }
}
rules_catalogue annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}

Prompts

0 advertised

No prompt definitions available.

Resources

0 advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (2 of 2 answered).

  1. 2026-11-07: 1 of 1 checks answered
  2. 2026-11-09: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
2421 ms
95th percentile latency
2421 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 2421 ms · metadata changed · 5 tool(s), 0 resource(s), 0 resource template(s), 0 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http aerset-mcp https://mcp.aerset.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add aerset-mcp --url https://mcp.aerset.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable aerset-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "aerset-mcp": {
      "url": "https://mcp.aerset.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "aerset-mcp": {
      "type": "streamableHttp",
      "url": "https://mcp.aerset.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start aerset-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "aerset-mcp": {
      "type": "http",
      "url": "https://mcp.aerset.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http aerset-mcp https://mcp.aerset.com/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://mcp.aerset.com/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "aerset-mcp": {
      "serverUrl": "https://mcp.aerset.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Aerset MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Aerset MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing