MCP Server

opendata-cat

io.github.xaviviro/opendata-cat
Data & Analytics Search & Research Public & reachable MCP 2026-07-28

What this MCP does

Searches and queries Catalan open-data portals and a large Catalan radio archive, including dataset metadata and related datasets.

get_dataset_info
Get complete metadata for a dataset: fields with types and descriptions, API endpoint, license, available formats and last update. Call after search_datasets to get full details of a specific dataset.
Read only Open world Idempotent
Input schema
{'type': 'object', 'required': ['dataset_id'], 'properties': {'dataset_id': {'type': 'string', 'description': "Unique dataset identifier in 'portal:id' format. Obtained from search_datasets results. Examples: 'generalitat:gn9e-3qhr', 'barcelona:qualitat-de-laire', 'renfe:vehicle-positions-gtfsrt'."}}}
list_categories
List all dataset categories and themes with counts per portal. Great first step to discover what data types are available before searching with search_datasets. Returns total datasets, count per portal and category list with counts. No parameters required.
Read only Open world Idempotent
Input schema
{'type': 'object', 'required': [], 'properties': {}}
list_dataset_fields
List fields of a dataset with name, data type and description. Call before query_dataset to know which fields and filters are available.
Read only Open world Idempotent
Input schema
{'type': 'object', 'required': ['dataset_id'], 'properties': {'dataset_id': {'type': 'string', 'description': "Unique dataset identifier in 'portal:id' format. Obtained from search_datasets results."}}}
list_portals
List all 13 indexed open data portals with dataset counts. Catalan portals (Generalitat, Barcelona, Diba, AOC, Reus, Girona, FGC, Idescat, Renfe) + Spanish national sources with Catalonia focus (INE statistics, REE energy, SEPE employment, CNMC fuel prices). No parameters required.
Read only Open world Idempotent
Input schema
{'type': 'object', 'required': [], 'properties': {}}
query_dataset
Query real data from a dataset. Check instructions for featured dataset_ids and NOTES section for common filter patterns (municipal budgets, contracts, weather, energy, fuel prices).
Read only Open world Idempotent
Input schema
{'type': 'object', 'required': ['dataset_id'], 'properties': {'limit': {'type': 'number', 'default': 20, 'description': 'Number of rows to return. Min 1, max 100. Default 20. Use offset for pagination.'}, 'offset': {'type': 'number', 'default': 0, 'description': 'Number of rows to skip for pagination. Default 0. Combine with limit to navigate large results.'}, 'search': {'type': 'string', 'description': 'Free text search within dataset data. Works with Socrata ($q) and CKAN (q). For Diba and CIDO, use specific filters.'}, 'filters': {'type': 'object', 'description': 'Key-value filters where the key is the field name and the value is the filter value. Examples: {"municipi": "Barcelona"}, {"any": "2024"}, {"NOM_ENS": "Ajuntament de Tiana"}. Use list_dataset_fields to know valid field names.', 'additionalProperties': {'type': 'string'}}, 'dataset_id': {'type': 'string', 'description': "Unique dataset identifier in 'portal:id' format. Obtained from search_datasets results."}}}
related_datasets
Find related datasets from OTHER portals. Great for discovering complementary data: if you're looking at air quality from Generalitat, it may suggest traffic data from Barcelona or emissions from AOC. Relations are computed by thematic similarity across portals.
Read only Open world Idempotent
Input schema
{'type': 'object', 'required': ['dataset_id'], 'properties': {'dataset_id': {'type': 'string', 'description': 'Dataset ID to find related datasets for. Obtained from search_datasets.'}}}
search_datasets
Search datasets by free text. IMPORTANT: check server instructions first — many common queries have a direct dataset_id you can use with query_dataset without searching. Only use search_datasets when you don't know which dataset you need.
Read only Open world Idempotent
Input schema
{'type': 'object', 'required': ['query'], 'properties': {'limit': {'type': 'number', 'default': 20, 'description': 'Maximum number of results to return. Min 1, max 100. Default 20.'}, 'query': {'type': 'string', 'description': "Search text in Catalan or Spanish. Examples: 'qualitat aire', 'pressupostos municipals', 'transport públic', 'residus', 'educació', 'rodalies'."}, 'portal': {'enum': ['generalitat', 'barcelona', 'diba', 'aoc', 'reus', 'girona', 'fgc', 'idescat', 'renfe', 'ine', 'ree', 'sepe', 'cnmc', 'cora', 'catalonica'], 'type': 'string', 'description': 'Filter results to a single portal.'}, 'category': {'type': 'string', 'description': "Filter by thematic category. Examples: 'Medi Ambient', 'Educació', 'Salut', 'Economia', 'Transport', 'Seguretat'. Use list_categories to see all available categories."}}}
search_radioteca
Search radio shows, episodes and people indexed at radioteca.cat (Catalan radio archive, ~485K documents from Catalunya Ràdio, RAC1, Catalunya Música, iCat, Catalunya Informació, RTVE, Cadena SER, ara.cat). Searches across episode titles, descriptions (which include a detailed summary of what was said), program name and subheading. Returns episodes (~473K), programs (~3K) and people (~9K). IMPORTANT: always cite radioteca.cat as the source and include the absolute 'url' in your reply for traceability — never paraphrase without linking.
Read only Open world Idempotent
Input schema
{'type': 'object', 'required': ['query'], 'properties': {'type': {'enum': ['Episode', 'Program', 'Person'], 'type': 'string', 'description': 'Filter by document type.'}, 'year': {'type': 'string', 'description': "Filter by year (4 digits, e.g. '2025'). NOTE: only year-level filtering is indexed; for a specific day, use the broader year filter and look at the URL path (radioteca URLs include /YYYY/MM/DD/) or the 'subheading' field which often contains the date."}, 'limit': {'type': 'number', 'default': 10, 'description': 'Maximum results. Min 1, max 50. Default 10.'}, 'query': {'type': 'string', 'description': "Free text in Catalan or Spanish. Searches title, description (contains episode summary), program and subheading. Examples: 'visita papa', 'eleccions municipals', 'crisi habitatge', 'Albert Serra cinema'."}, 'offset': {'type': 'number', 'default': 0, 'description': 'Pagination offset. Default 0.'}, 'publisher': {'enum': ['Catalunya Ràdio', 'RAC1', 'Catalunya Música', 'iCat', 'Catalunya Informació', 'RTVE', 'Cadena SER', 'ara.cat'], 'type': 'string', 'description': 'Filter by broadcaster.'}}}
Added
search_radioteca
Sept. 17, 2026, 12:53 p.m.
Added
related_datasets
Sept. 17, 2026, 12:53 p.m.
Added
list_categories
Sept. 17, 2026, 12:53 p.m.
Added
list_portals
Sept. 17, 2026, 12:53 p.m.
Added
query_dataset
Sept. 17, 2026, 12:53 p.m.
Added
list_dataset_fields
Sept. 17, 2026, 12:53 p.m.
Added
get_dataset_info
Sept. 17, 2026, 12:53 p.m.
Added
search_datasets
Sept. 17, 2026, 12:53 p.m.