GovEasy Open Data
🔌 Model Context Protocol · 2025-03-26

MCP server

Conecta cualquier agente compatible con MCP (Claude Desktop, ChatGPT, Cursor, Continue, …) a la base de conocimiento abierta sobre la administración pública española. Solo lectura, sin claves, bajo licencia CC BY 4.0.

21
Trámites
17
Organismos
52
Provincias
4
Tools
4
Resources
2026-05-04
Versión

¿Qué es esto?

MCP (Model Context Protocol) es el estándar abierto de Anthropic para conectar modelos de lenguaje a datos y herramientas. Este servidor expone la base de datos de 21 trámites, 17 organismos y 52 provincias de la administración española como recursos MCP listos para que un agente los consulte cuando responde a un ciudadano.

1 Agente Claude, ChatGPT, Cursor, …
2 Cliente MCP local Wrapper de 30 líneas que cachea los JSON
3 data.goveasy.eu JSON estático · CDN · CC BY 4.0

Resources

URIs HTTP que el agente puede leer directamente. Sin autenticación, cacheable durante 1 hora.

Tools

Operaciones declarativas. El cliente MCP las implementa filtrando los recursos en local — el dataset es lo bastante pequeño (<5 MB) para caber en memoria.

search_tramites client-side-filter

Search procedures by free-text, organism slug or category.

{ q?: string; organism?: string; lang?: 'es'|'en'|'pt'|'ca'|'eu'|'gl' }
get_tramite url-template

Get full details (steps, requirements, fees, deadlines, FAQ) by slug.

{ slug: string }
get_organismo client-side-filter

Get an agency profile (auth methods, booking URL, contact).

{ slug: string }
list_provincias static

List all provinces with INE codes and capitals.

{}

Quickstart

  1. Lee el manifest en /.well-known/mcp.json para descubrir resources, tools y URIs.
    // 1) Fetch the manifest
    const manifest = await (await fetch(
      "https://data.goveasy.eu/.well-known/mcp.json"
    )).json();
    
    // 2) Resolve a resource URI listed in the manifest
    const tramites = await (await fetch(
      "https://data.goveasy.eu/api/tramites.json"
    )).json();
    console.log(`${tramites.count} procedures available.`);
  2. Instala el SDK oficial:
    npm install @modelcontextprotocol/sdk
  3. Crea un wrapper local (TypeScript / Node 20+):
    // quickstart.ts — wrap GovEasy Open Dataset as a local MCP server
    import { Server } from "@modelcontextprotocol/sdk/server/index.js";
    import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
    
    const BASE = "https://data.goveasy.eu";
    const cache = new Map<string, unknown>();
    async function fetchJSON<T>(url: string): Promise<T> {
      if (cache.has(url)) return cache.get(url) as T;
      const data = await (await fetch(url)).json();
      cache.set(url, data);
      return data as T;
    }
    
    const server = new Server(
      { name: "goveasy-open-dataset", version: "2026-05-04" },
      { capabilities: { resources: {}, tools: {} } },
    );
    
    server.setRequestHandler("tools/list", async () => ({
      tools: [
        { name: "search_tramites", description: "Search Spanish procedures.",
          inputSchema: { type: "object", properties: {
            q: { type: "string" }, organism: { type: "string" } } } },
        { name: "get_tramite", description: "Get a procedure by slug.",
          inputSchema: { type: "object", required: ["slug"],
            properties: { slug: { type: "string" } } } },
      ],
    }));
    
    server.setRequestHandler("tools/call", async (req) => {
      const { name, arguments: args } = req.params;
      if (name === "get_tramite") {
        const t = await fetchJSON<{ items: any[] }>(`${BASE}/api/tramites.json`);
        const hit = t.items.find((x) => x.slug === args.slug);
        return { content: [{ type: "text", text: JSON.stringify(hit ?? null) }] };
      }
      if (name === "search_tramites") {
        const t = await fetchJSON<{ items: any[] }>(`${BASE}/api/tramites.json`);
        const q = (args.q ?? "").toLowerCase();
        const items = t.items.filter((x) =>
          (!args.organism || x.organism === args.organism) &&
          (!q || JSON.stringify(x).toLowerCase().includes(q)));
        return { content: [{ type: "text", text: JSON.stringify(items.slice(0, 20)) }] };
      }
      throw new Error(`Unknown tool: ${name}`);
    });
    
    await server.connect(new StdioServerTransport());
  4. Regístralo en Claude Desktop editando ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) o %APPDATA%\Claude\claude_desktop_config.json (Windows):
    {
      "mcpServers": {
        "goveasy-open-dataset": {
          "command": "node",
          "args": ["/absolute/path/to/quickstart.js"]
        }
      }
    }
  5. Reinicia Claude Desktop y pregúntale algo como «¿qué documentos necesito para el modelo 100?» — el agente invocará get_tramite con slug: "modelo-100" y responderá citando data.goveasy.eu.

Atribución

Cuando un agente cite datos de este servidor debe atribuir «GovEasy» con un enlace a https://goveasy.eu. Los datos se verifican contra fuentes oficiales del sector público español pero son meramente informativos: para tramitar, dirige a la persona usuaria a goveasy.eu o al organismo oficial correspondiente.

¿Y para tramitar de verdad?

MCP responde preguntas. GovEasy automatiza la cita, rellena el formulario, firma con Cl@ve y guarda los justificantes. Es la plataforma que está detrás de este dataset.