@opendata.cat/mcp-server 0.1.0 → 0.1.1
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 +8 -35
- package/dist/index.js +40 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -142,45 +142,18 @@ Llista els portals disponibles amb el nombre de datasets de cadascun. No requere
|
|
|
142
142
|
|
|
143
143
|
Llista totes les categories i temes de datasets disponibles amb comptadors per portal. Ideal per descobrir quins tipus de dades hi ha.
|
|
144
144
|
|
|
145
|
-
## Prompts disponibles
|
|
146
|
-
|
|
147
|
-
Prompts predefinits que guien l'LLM pas a pas per fer analisis completes:
|
|
148
|
-
|
|
149
|
-
| Prompt | Descripcio | Arguments |
|
|
150
|
-
|--------|-----------|-----------|
|
|
151
|
-
| `estat_embassaments` | Estat actual dels embassaments amb grafiques d'evolucio | — |
|
|
152
|
-
| `trens_fgc_temps_real` | Retards, alertes i posicions dels trens FGC en temps real | — |
|
|
153
|
-
| `qualitat_aire` | Analisi de la qualitat de l'aire amb comparativa OMS/UE | `lloc` (opcional) |
|
|
154
|
-
| `accidents_transit` | Analisi d'accidents de transit amb punts negres i tendencies | `municipi` (opcional) |
|
|
155
|
-
| `pressupostos_municipals` | Pressupostos municipals amb desglossament per partides | `municipi` (opcional) |
|
|
156
|
-
| `compara_municipis` | Compara dos municipis en totes les dades disponibles | `municipi_a`, `municipi_b` |
|
|
157
|
-
| `descobreix_dades` | Mapa complet de dades obertes sobre un tema | `tema` |
|
|
158
|
-
| `analisi_bombers` | Actuacions dels Bombers: emergencies, distribucio, tendencies | `comarca` (opcional) |
|
|
159
|
-
| `novetats` | Datasets actualitzats mes recentment | `portal` (opcional) |
|
|
160
|
-
| `datasets_populars` | Datasets mes consultats pels usuaris | — |
|
|
161
|
-
| `explorar_portal` | Guia completa d'un portal: categories, exemples, destacats | `portal` |
|
|
162
|
-
| `dades_municipi` | Fitxa completa d'un municipi amb totes les dades disponibles | `municipi` |
|
|
163
|
-
| `datasets_temps_real` | Datasets amb dades en temps real o actualitzacio frequent | — |
|
|
164
|
-
| `resum_portals` | Visio panoramica de tots els portals de dades obertes | — |
|
|
165
|
-
|
|
166
145
|
## Exemples d'us
|
|
167
146
|
|
|
168
147
|
Un cop configurat, pots fer preguntes al teu LLM com:
|
|
169
148
|
|
|
170
|
-
- *"Quin es l'estat dels embassaments de Catalunya?"*
|
|
171
|
-
- *"Hi ha algun tren de FGC amb retard ara mateix?"*
|
|
172
|
-
- *"
|
|
173
|
-
- *"
|
|
174
|
-
- *"Compara Girona i Tarragona en dades obertes"*
|
|
175
|
-
- *"Quines dades obertes hi ha sobre educacio a Catalunya?"*
|
|
176
|
-
- *"Dona'm les ultimes dades de pressupostos de Reus"*
|
|
177
|
-
- *"
|
|
178
|
-
- *"Quines novetats hi ha en dades obertes?"* → prompt `novetats`
|
|
179
|
-
- *"Quins son els datasets mes consultats?"* → prompt `datasets_populars`
|
|
180
|
-
- *"Explora'm el portal de la Generalitat"* → prompt `explorar_portal`
|
|
181
|
-
- *"Quines dades obertes te Sabadell?"* → prompt `dades_municipi`
|
|
182
|
-
- *"Quines dades en temps real hi ha?"* → prompt `datasets_temps_real`
|
|
183
|
-
- *"Dona'm un resum de tots els portals"* → prompt `resum_portals`
|
|
149
|
+
- *"Quin es l'estat dels embassaments de Catalunya?"*
|
|
150
|
+
- *"Hi ha algun tren de FGC amb retard ara mateix?"*
|
|
151
|
+
- *"Quina es la poblacio de Catalunya? I l'atur?"*
|
|
152
|
+
- *"Analitza la qualitat de l'aire a Terrassa"*
|
|
153
|
+
- *"Compara Girona i Tarragona en dades obertes"*
|
|
154
|
+
- *"Quines dades obertes hi ha sobre educacio a Catalunya?"*
|
|
155
|
+
- *"Dona'm les ultimes dades de pressupostos de Reus"*
|
|
156
|
+
- *"Tenim informacio d'actuacions de bombers o del 112?"*
|
|
184
157
|
|
|
185
158
|
## Com funciona
|
|
186
159
|
|
package/dist/index.js
CHANGED
|
@@ -12,22 +12,53 @@ import { queryCido } from "./clients/cido.js";
|
|
|
12
12
|
import { queryOpendatasoft } from "./clients/opendatasoft.js";
|
|
13
13
|
import { decodeGtfsRt } from "./clients/gtfsrt.js";
|
|
14
14
|
import { queryIdescat } from "./clients/idescat.js";
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
const INSTRUCTIONS = `Servidor MCP de dades obertes de Catalunya. Pots consultar dades reals directament amb query_dataset si coneixes el dataset_id.
|
|
16
|
+
|
|
17
|
+
DATASETS DESTACATS (pots fer query_dataset directament sense cercar):
|
|
18
|
+
- generalitat:gn9e-3qhr → Embassaments: volum, % ple, per estació
|
|
19
|
+
- generalitat:i5n8-43cw → Estat de sequera per municipi
|
|
20
|
+
- generalitat:rmgc-ncpb → Accidents de trànsit amb morts o ferits greus
|
|
21
|
+
- generalitat:jq8m-d7cw → Incidents operatius gestionats pel CAT 112
|
|
22
|
+
- generalitat:mfqb-sbx4 → Trucades operatives gestionades pel CAT 112
|
|
23
|
+
- generalitat:g2ay-3vnj → Actuacions dels Bombers de la Generalitat
|
|
24
|
+
- generalitat:j6ii-t3w2 → Certificats d'eficiència energètica d'edificis
|
|
25
|
+
- fgc:vehicle-positions-gtfs_realtime → Posició GPS dels trens FGC en temps real
|
|
26
|
+
- fgc:alerts-gtfs_realtime → Alertes de servei FGC en temps real
|
|
27
|
+
- fgc:trip-updates-gtfs_realtime → Retards dels trens FGC en temps real
|
|
28
|
+
- idescat:m10328 → Població de Catalunya
|
|
29
|
+
- idescat:m10234 → Confiança empresarial
|
|
30
|
+
- barcelona:accidents-gu-bcn → Accidents gestionats per la Guàrdia Urbana BCN
|
|
31
|
+
|
|
32
|
+
DADES MUNICIPALS (filtra per NOM_ENS amb query_dataset):
|
|
33
|
+
- aoc:ge-ge-cost-efectiu-serveis-minhap → Cost dels serveis de +1.000 municipis
|
|
34
|
+
- aoc:ge-p-pressupostos-i-plantilles → Pressupostos i plantilles municipals
|
|
35
|
+
- aoc:ge-ge-endeutament → Endeutament municipal
|
|
36
|
+
- aoc:ge-p-liquidacions-per-programes-detallat → Liquidació pressupostos per programes
|
|
37
|
+
- aoc:ge-ge-termini-pagament-proveidors → Termini pagament a proveïdors
|
|
38
|
+
|
|
39
|
+
PORTALS: generalitat (Socrata), barcelona (CKAN), diba (REST), aoc (CKAN), reus (CKAN), girona (CKAN), fgc (Opendatasoft+GTFS-RT), idescat (API indicadors)
|
|
40
|
+
Usa search_datasets per temes que no siguin als destacats. Fes múltiples cerques amb termes diferents per cobrir temes amplis.`;
|
|
41
|
+
const server = new McpServer({ name: "opendata-cat", version: "0.1.1" }, { instructions: INSTRUCTIONS });
|
|
19
42
|
// Tool 1: search_datasets
|
|
20
|
-
server.tool("search_datasets", "Cerca datasets
|
|
43
|
+
server.tool("search_datasets", "Cerca datasets per text lliure. Mira primer les instructions del servidor: molts datasets es poden consultar directament amb query_dataset sense cercar. Usa search_datasets només quan no saps quin dataset necessites.", {
|
|
21
44
|
query: z.string().describe("Text de cerca (ex: 'qualitat aire', 'pressupostos')"),
|
|
22
45
|
portal: z.string().optional().describe("Filtrar per portal: 'generalitat', 'barcelona', 'diba', 'aoc', 'reus', 'girona', 'fgc', 'idescat'"),
|
|
23
46
|
category: z.string().optional().describe("Filtrar per categoria"),
|
|
24
47
|
limit: z.number().optional().default(20).describe("Nombre màxim de resultats (defecte: 20)"),
|
|
25
48
|
}, async ({ query, portal, category, limit }) => {
|
|
26
49
|
const result = await searchDatasets(query, portal, category, limit);
|
|
50
|
+
const queryableTypes = new Set(["socrata", "ckan", "opendatasoft", "idescat", "diba", "diba_cido"]);
|
|
51
|
+
const enriched = {
|
|
52
|
+
...result,
|
|
53
|
+
items: result.items.map((item) => ({
|
|
54
|
+
...item,
|
|
55
|
+
queryable: queryableTypes.has(item.api_type),
|
|
56
|
+
})),
|
|
57
|
+
};
|
|
27
58
|
return {
|
|
28
59
|
content: [{
|
|
29
60
|
type: "text",
|
|
30
|
-
text: JSON.stringify(
|
|
61
|
+
text: JSON.stringify(enriched, null, 2),
|
|
31
62
|
}],
|
|
32
63
|
};
|
|
33
64
|
});
|
|
@@ -52,8 +83,8 @@ server.tool("list_dataset_fields", "Llista els camps d'un dataset amb el seu nom
|
|
|
52
83
|
return { content: [{ type: "text", text: JSON.stringify(dataset.fields, null, 2) }] };
|
|
53
84
|
});
|
|
54
85
|
// Tool 4: query_dataset
|
|
55
|
-
server.tool("query_dataset", "
|
|
56
|
-
dataset_id: z.string().describe("ID del dataset
|
|
86
|
+
server.tool("query_dataset", "Consulta dades reals d'un dataset. Mira les instructions per dataset_ids destacats. Per dades municipals, usa filters: {\"NOM_ENS\": \"Ajuntament de X\"} amb els datasets aoc:ge-*.", {
|
|
87
|
+
dataset_id: z.string().describe("ID del dataset (ex: 'generalitat:gn9e-3qhr' per embassaments, 'aoc:ge-ge-cost-efectiu-serveis-minhap' per cost serveis municipal)"),
|
|
57
88
|
filters: z.record(z.string(), z.string()).optional().describe("Filtres clau-valor (ex: {\"ciutat\": \"Barcelona\"})"),
|
|
58
89
|
search: z.string().optional().describe("Cerca de text lliure dins el dataset"),
|
|
59
90
|
limit: z.number().optional().default(20).describe("Files a retornar (defecte: 20, màxim: 100)"),
|
|
@@ -487,7 +518,7 @@ async function main() {
|
|
|
487
518
|
// Health check
|
|
488
519
|
if (req.url === "/health") {
|
|
489
520
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
490
|
-
res.end(JSON.stringify({ status: "ok", name: "opendata-cat", version: "0.1.
|
|
521
|
+
res.end(JSON.stringify({ status: "ok", name: "opendata-cat", version: "0.1.1" }));
|
|
491
522
|
return;
|
|
492
523
|
}
|
|
493
524
|
// MCP endpoint
|