@opendata.cat/mcp-server 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,35 +1,42 @@
1
1
  <p align="center">
2
- <img src="banner.png" alt="opendata.cat MCP — Connecta el teu LLM amb les dades obertes de Catalunya" width="100%">
2
+ <img src="banner.png" alt="Opendata.cat MCP Server — Connecta el teu LLM amb les dades obertes de Catalunya" width="100%">
3
+ </p>
4
+
5
+ <p align="center">
6
+ <a href="https://www.npmjs.com/package/@opendata.cat/mcp-server"><img src="https://img.shields.io/npm/v/@opendata.cat/mcp-server?color=c44536&label=npm" alt="npm"></a>
7
+ <a href="https://github.com/xaviviro/Opendata.cat-MCP-Server"><img src="https://img.shields.io/github/v/tag/xaviviro/Opendata.cat-MCP-Server?label=github&color=1a1a1a" alt="github"></a>
8
+ <a href="https://opendata.cat/mcp"><img src="https://img.shields.io/badge/web-opendata.cat%2Fmcp-c9a227" alt="web"></a>
9
+ <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/license-MIT-green" alt="license"></a>
3
10
  </p>
4
11
 
5
12
  # Opendata.cat MCP Server
6
13
 
7
- Servidor [MCP](https://modelcontextprotocol.io/) (Model Context Protocol) que connecta els models de llenguatge (Claude, ChatGPT, Gemini...) amb les **dades obertes públiques de Catalunya**. Cerca datasets, explora metadades i consulta dades reals de la Generalitat, l'Ajuntament de Barcelona i la Diputació de Barcelona directament des del teu assistent d'IA.
14
+ Servidor [MCP](https://modelcontextprotocol.io/) (Model Context Protocol) que connecta els models de llenguatge (Claude, ChatGPT, Gemini...) amb les **dades obertes publiques de Catalunya**. Cerca datasets, explora metadades i consulta dades reals de la Generalitat, l'Ajuntament de Barcelona i la Diputacio de Barcelona directament des del teu assistent d'IA.
8
15
 
9
- Un projecte d'**[opendata.cat](https://opendata.cat)** — associació sense ànim de lucre fundada el 2012 que promou la transparència, la difusió i l'estandardització de les dades obertes a Catalunya. Organitza formacions, conferències i desenvolupa plataformes per facilitar l'accés a la informació pública.
16
+ Un projecte d'**[opendata.cat](https://opendata.cat)** — associacio sense anim de lucre fundada el 2012 que promou la transparencia, la difusio i l'estandarditzacio de les dades obertes a Catalunya. Inspirat en el projecte [datagouv-mcp](https://github.com/datagouv/datagouv-mcp) del govern frances.
10
17
 
11
18
  ## Portals disponibles
12
19
 
13
20
  | Portal | Datasets | API | Dades |
14
21
  |--------|----------|-----|-------|
15
- | [Generalitat de Catalunya](https://analisi.transparenciacatalunya.cat) | ~1.480 | Socrata | Medi ambient, salut, educació, economia, transport... |
16
- | [Ajuntament de Barcelona](https://opendata-ajuntament.barcelona.cat) | ~1.036 | CKAN | Urbanisme, mobilitat, cultura, demografia, pressupostos... |
17
- | [Diputació de Barcelona](https://dadesobertes.diba.cat) | ~124 | CKAN | Municipis, equipaments, patrimoni, energia, territori... |
22
+ | [Generalitat de Catalunya](https://analisi.transparenciacatalunya.cat) | 1.058 | Socrata | Medi ambient, salut, educacio, economia, transport... |
23
+ | [Ajuntament de Barcelona](https://opendata-ajuntament.barcelona.cat) | 555 | CKAN | Urbanisme, mobilitat, cultura, demografia, pressupostos... |
24
+ | [Diputacio de Barcelona](https://dadesobertes.diba.cat) | 90 | CKAN | Municipis, equipaments, patrimoni, energia, territori... |
18
25
 
19
- **+2.600 datasets** actualitzats automàticament cada setmana.
26
+ El cataleg s'actualitza automaticament cada setmana.
20
27
 
21
- ## Instal·lació ràpida
28
+ ## Installacio rapida
22
29
 
23
30
  ### Claude Desktop
24
31
 
25
- Afegeix al fitxer de configuració (`~/Library/Application Support/Claude/claude_desktop_config.json` a macOS o `%APPDATA%\Claude\claude_desktop_config.json` a Windows):
32
+ Afegeix al fitxer de configuracio (`~/Library/Application Support/Claude/claude_desktop_config.json` a macOS o `%APPDATA%\Claude\claude_desktop_config.json` a Windows):
26
33
 
27
34
  ```json
28
35
  {
29
36
  "mcpServers": {
30
37
  "opendata-cat": {
31
38
  "command": "npx",
32
- "args": ["-y", "opendata-cat-mcp-server"]
39
+ "args": ["-y", "@opendata.cat/mcp-server"]
33
40
  }
34
41
  }
35
42
  }
@@ -38,7 +45,7 @@ Afegeix al fitxer de configuració (`~/Library/Application Support/Claude/claude
38
45
  ### Claude Code (CLI)
39
46
 
40
47
  ```bash
41
- claude mcp add opendata-cat -- npx -y opendata-cat-mcp-server
48
+ claude mcp add opendata-cat -- npx -y @opendata.cat/mcp-server
42
49
  ```
43
50
 
44
51
  ### VS Code / Cursor
@@ -50,7 +57,7 @@ Afegeix al fitxer `.vscode/mcp.json` del teu projecte:
50
57
  "servers": {
51
58
  "opendata-cat": {
52
59
  "command": "npx",
53
- "args": ["-y", "opendata-cat-mcp-server"]
60
+ "args": ["-y", "@opendata.cat/mcp-server"]
54
61
  }
55
62
  }
56
63
  }
@@ -58,13 +65,13 @@ Afegeix al fitxer `.vscode/mcp.json` del teu projecte:
58
65
 
59
66
  ## Tools disponibles
60
67
 
61
- | Tool | Descripció |
68
+ | Tool | Descripcio |
62
69
  |------|-----------|
63
- | `search_datasets` | Cerca datasets per text lliure al catàleg de +2.600 datasets |
64
- | `get_dataset_info` | Retorna metadades completes: camps, tipus, llicència, endpoint |
65
- | `list_dataset_fields` | Llista els camps d'un dataset amb nom, tipus i descripció |
70
+ | `search_datasets` | Cerca datasets per text lliure al cataleg |
71
+ | `get_dataset_info` | Retorna metadades completes: camps, tipus, llicencia, endpoint |
72
+ | `list_dataset_fields` | Llista els camps d'un dataset amb nom, tipus i descripcio |
66
73
  | `query_dataset` | Consulta dades reals directament al portal origen |
67
- | `list_portals` | Llista els portals disponibles amb estadístiques |
74
+ | `list_portals` | Llista els portals disponibles amb estadistiques |
68
75
  | `list_categories` | Llista categories i temes disponibles amb comptadors |
69
76
 
70
77
  ### search_datasets
@@ -88,7 +95,7 @@ dataset_id: "generalitat:gn9e-3qhr"
88
95
 
89
96
  ### list_dataset_fields
90
97
 
91
- Llista els camps d'un dataset amb nom, tipus i descripció.
98
+ Llista els camps d'un dataset amb nom, tipus i descripcio.
92
99
 
93
100
  ```
94
101
  dataset_id: "generalitat:gn9e-3qhr"
@@ -102,34 +109,34 @@ Executa una consulta directament contra el portal origen i retorna dades reals.
102
109
  dataset_id: "generalitat:gn9e-3qhr"
103
110
  filters: {"estaci": "Sau"} # opcional
104
111
  search: "embassament" # opcional
105
- limit: 20 # opcional (defecte: 20, màx: 100)
112
+ limit: 20 # opcional (defecte: 20, max: 100)
106
113
  offset: 0 # opcional
107
114
  ```
108
115
 
109
116
  ### list_portals
110
117
 
111
- Llista els portals disponibles amb el nombre de datasets de cadascun. No requereix paràmetres.
118
+ Llista els portals disponibles amb el nombre de datasets de cadascun. No requereix parametres.
112
119
 
113
120
  ### list_categories
114
121
 
115
122
  Llista totes les categories i temes de datasets disponibles amb comptadors per portal. Ideal per descobrir quins tipus de dades hi ha.
116
123
 
117
- ## Exemples d'ús
124
+ ## Exemples d'us
118
125
 
119
126
  Un cop configurat, pots fer preguntes al teu LLM com:
120
127
 
121
128
  - *"Quins datasets hi ha sobre mobilitat a Barcelona?"*
122
129
  - *"Mostra'm les dades de qualitat de l'aire d'ahir"*
123
- - *"Quants equipaments culturals Girona?"*
124
- - *"Dona'm les últimes dades de pressupostos municipals"*
125
- - *"Quin és l'estat dels embassaments de Catalunya?"*
126
- - *"Compara les dades de transport públic entre Barcelona i la Diputació"*
127
- - *"Quines dades obertes hi ha sobre educació a Catalunya?"*
130
+ - *"Quants equipaments culturals te Girona?"*
131
+ - *"Dona'm les ultimes dades de pressupostos municipals"*
132
+ - *"Quin es l'estat dels embassaments de Catalunya?"*
133
+ - *"Quines dades obertes hi ha sobre educacio a Catalunya?"*
134
+ - *"Quins tipus de dades teniu disponibles?"*
128
135
 
129
136
  ## Com funciona
130
137
 
131
138
  ```
132
- Usuari → LLM → MCP opendata.cat → API opendata.cat (catàleg)
139
+ Usuari → LLM → MCP opendata.cat → API opendata.cat (cataleg)
133
140
  → Portal origen (dades reals)
134
141
  ```
135
142
 
@@ -141,15 +148,15 @@ No emmagatzema ni fa de proxy de dades. Cada consulta va directament a la font o
141
148
 
142
149
  ## Sobre opendata.cat
143
150
 
144
- [opendata.cat](https://opendata.cat) és una associació catalana sense ànim de lucre fundada el 2012 (registre 47468) dedicada a promoure la transparència i l'accés a la informació pública. Treballa en tres eixos: **estandardització** de formats i protocols, **formació** especialitzada per a professionals i administracions, i **col·laboració** público-privada per a l'obertura de dades.
151
+ [opendata.cat](https://opendata.cat) es una associacio catalana sense anim de lucre fundada el 2012 (registre 47468) dedicada a promoure la transparencia i l'acces a la informacio publica. Treballa en tres eixos: **estandarditzacio** de formats i protocols, **formacio** especialitzada per a professionals i administracions, i **collaboracio** publico-privada per a l'obertura de dades.
145
152
 
146
153
  ## Contribuir
147
154
 
148
- Les contribucions són benvingudes! Per afegir un nou portal de dades obertes:
155
+ Les contribucions son benvingudes! Per afegir un nou portal de dades obertes:
149
156
 
150
157
  1. Obre una [issue](https://github.com/xaviviro/Opendata.cat-MCP-Server/issues) amb la URL del portal i el tipus d'API
151
158
  2. O envia un pull request
152
159
 
153
- ## Llicència
160
+ ## Llicencia
154
161
 
155
162
  MIT
package/dist/api.d.ts CHANGED
@@ -14,7 +14,7 @@ export interface DatasetDetail {
14
14
  description: string;
15
15
  category: string;
16
16
  tags: string[];
17
- api_type: "socrata" | "ckan";
17
+ api_type: "socrata" | "ckan" | "diba";
18
18
  api_endpoint: string;
19
19
  formats: string[];
20
20
  fields: {
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Consulta l'API REST de la Diputació de Barcelona (do.diba.cat).
3
+ * Format: /api/dataset/{name}/format/json/pag-ini/{start}/pag-fi/{end}
4
+ * Filtres: /camp-filtre/{field}/valor-filtre/{value}
5
+ * Relacions: /camp-rel/{field}/valor-rel/{value}
6
+ */
7
+ export declare function queryDiba(endpoint: string, filters?: Record<string, string>, search?: string, limit?: number, offset?: number): Promise<{
8
+ elements: Record<string, unknown>[];
9
+ total: number;
10
+ }>;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Consulta l'API REST de la Diputació de Barcelona (do.diba.cat).
3
+ * Format: /api/dataset/{name}/format/json/pag-ini/{start}/pag-fi/{end}
4
+ * Filtres: /camp-filtre/{field}/valor-filtre/{value}
5
+ * Relacions: /camp-rel/{field}/valor-rel/{value}
6
+ */
7
+ export async function queryDiba(endpoint, filters, search, limit = 20, offset = 0) {
8
+ let url = endpoint;
9
+ // Assegurar format JSON
10
+ if (!url.includes("/format/")) {
11
+ url += "/format/json";
12
+ }
13
+ // Paginació
14
+ url += `/pag-ini/${offset}/pag-fi/${offset + limit}`;
15
+ // Filtres
16
+ if (filters) {
17
+ for (const [key, value] of Object.entries(filters)) {
18
+ url += `/camp-filtre/${encodeURIComponent(key)}/valor-filtre/${encodeURIComponent(value)}`;
19
+ }
20
+ }
21
+ const resp = await fetch(url);
22
+ if (!resp.ok)
23
+ throw new Error(`Diba error ${resp.status}: ${resp.statusText}`);
24
+ const data = await resp.json();
25
+ return {
26
+ elements: data.elements ?? [],
27
+ total: data.entitats ?? 0,
28
+ };
29
+ }
package/dist/index.js CHANGED
@@ -5,9 +5,10 @@ import { z } from "zod";
5
5
  import { searchDatasets, getDatasetInfo, getCategories } from "./api.js";
6
6
  import { querySocrata } from "./clients/socrata.js";
7
7
  import { queryCkan } from "./clients/ckan.js";
8
+ import { queryDiba } from "./clients/diba.js";
8
9
  const server = new McpServer({
9
10
  name: "opendata-cat",
10
- version: "0.0.1",
11
+ version: "0.0.3",
11
12
  });
12
13
  // Tool 1: search_datasets
13
14
  server.tool("search_datasets", "Cerca datasets de dades obertes catalanes per text lliure. Retorna nom, descripció, portal i formats.", {
@@ -61,6 +62,10 @@ server.tool("query_dataset", "Executa una consulta contra un dataset i retorna f
61
62
  if (dataset.api_type === "socrata") {
62
63
  results = await querySocrata(dataset.api_endpoint, filters, search, limit, offset);
63
64
  }
65
+ else if (dataset.api_type === "diba") {
66
+ const data = await queryDiba(dataset.api_endpoint, filters, search, limit, offset);
67
+ results = data.elements;
68
+ }
64
69
  else {
65
70
  const data = await queryCkan(dataset.api_endpoint, filters, search, limit, offset);
66
71
  results = data.records;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.0.1",
6
+ "version": "0.0.3",
7
7
  "description": "Servidor MCP per consultar les dades obertes públiques de Catalunya",
8
8
  "type": "module",
9
9
  "main": "dist/index.js",