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.
¿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.
Resources
URIs HTTP que el agente puede leer directamente. Sin autenticación, cacheable durante 1 hora.
Trámites tramites
21 Spanish procedures with steps, requirements, deadlines, fees and official URLs.
Organismos organismos
17 public-sector agencies (AEAT, DGT, SS, INE, …) with auth methods and booking URLs.
Provincias provincias
52 provinces with INE codes, capitals and territorial booking URLs.
Corpus completo corpus-text
Plain-text concatenated dump of the full dataset (retrieval / fine-tuning).
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
- Lee el manifest en
/.well-known/mcp.jsonpara 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.`); - Instala el SDK oficial:
npm install @modelcontextprotocol/sdk - 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()); - 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"] } } } - Reinicia Claude Desktop y pregúntale algo como
«¿qué documentos necesito para el modelo 100?» — el agente
invocará
get_tramiteconslug: "modelo-100"y responderá citandodata.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.
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.