@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 +37 -30
- package/dist/api.d.ts +1 -1
- package/dist/clients/diba.d.ts +10 -0
- package/dist/clients/diba.js +29 -0
- package/dist/index.js +6 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,35 +1,42 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="banner.png" alt="
|
|
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
|
|
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)** —
|
|
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) |
|
|
16
|
-
| [Ajuntament de Barcelona](https://opendata-ajuntament.barcelona.cat) |
|
|
17
|
-
| [
|
|
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
|
-
|
|
26
|
+
El cataleg s'actualitza automaticament cada setmana.
|
|
20
27
|
|
|
21
|
-
##
|
|
28
|
+
## Installacio rapida
|
|
22
29
|
|
|
23
30
|
### Claude Desktop
|
|
24
31
|
|
|
25
|
-
Afegeix al fitxer de
|
|
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
|
|
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
|
|
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
|
|
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 |
|
|
68
|
+
| Tool | Descripcio |
|
|
62
69
|
|------|-----------|
|
|
63
|
-
| `search_datasets` | Cerca datasets per text lliure al
|
|
64
|
-
| `get_dataset_info` | Retorna metadades completes: camps, tipus,
|
|
65
|
-
| `list_dataset_fields` | Llista els camps d'un dataset amb nom, tipus i
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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'
|
|
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
|
|
124
|
-
- *"Dona'm les
|
|
125
|
-
- *"Quin
|
|
126
|
-
- *"
|
|
127
|
-
- *"
|
|
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 (
|
|
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)
|
|
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
|
|
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
|
-
##
|
|
160
|
+
## Llicencia
|
|
154
161
|
|
|
155
162
|
MIT
|
package/dist/api.d.ts
CHANGED
|
@@ -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.
|
|
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;
|