@aborruso/ckan-mcp-server 0.4.17 → 0.4.18
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/LOG.md +59 -0
- package/README.md +104 -34
- package/dist/index.js +161 -45
- package/dist/worker.js +42 -42
- package/package.json +12 -1
- package/.devin/wiki.json +0 -273
- package/CLAUDE.md +0 -398
- package/PRD.md +0 -999
- package/REFACTORING.md +0 -238
- package/examples/langgraph/01_basic_workflow.py +0 -277
- package/examples/langgraph/02_data_exploration.py +0 -366
- package/examples/langgraph/README.md +0 -719
- package/examples/langgraph/metadata_quality.py +0 -299
- package/examples/langgraph/requirements.txt +0 -12
- package/examples/langgraph/setup.sh +0 -32
- package/examples/langgraph/test_setup.py +0 -106
- package/openspec/AGENTS.md +0 -456
- package/openspec/changes/add-ckan-analyze-dataset-structure/proposal.md +0 -17
- package/openspec/changes/add-ckan-analyze-dataset-structure/specs/ckan-insights/spec.md +0 -7
- package/openspec/changes/add-ckan-analyze-dataset-structure/tasks.md +0 -6
- package/openspec/changes/add-ckan-analyze-dataset-updates/proposal.md +0 -17
- package/openspec/changes/add-ckan-analyze-dataset-updates/specs/ckan-insights/spec.md +0 -7
- package/openspec/changes/add-ckan-analyze-dataset-updates/tasks.md +0 -6
- package/openspec/changes/add-ckan-audit-tool/proposal.md +0 -17
- package/openspec/changes/add-ckan-audit-tool/specs/ckan-insights/spec.md +0 -7
- package/openspec/changes/add-ckan-audit-tool/tasks.md +0 -6
- package/openspec/changes/add-ckan-dataset-insights/proposal.md +0 -17
- package/openspec/changes/add-ckan-dataset-insights/specs/ckan-insights/spec.md +0 -7
- package/openspec/changes/add-ckan-dataset-insights/tasks.md +0 -6
- package/openspec/changes/add-ckan-host-allowlist-env/design.md +0 -38
- package/openspec/changes/add-ckan-host-allowlist-env/proposal.md +0 -16
- package/openspec/changes/add-ckan-host-allowlist-env/specs/ckan-request-allowlist/spec.md +0 -15
- package/openspec/changes/add-ckan-host-allowlist-env/specs/cloudflare-deployment/spec.md +0 -11
- package/openspec/changes/add-ckan-host-allowlist-env/tasks.md +0 -12
- package/openspec/changes/add-escape-text-query/proposal.md +0 -12
- package/openspec/changes/add-escape-text-query/specs/ckan-search/spec.md +0 -11
- package/openspec/changes/add-escape-text-query/tasks.md +0 -8
- package/openspec/changes/add-mqa-quality-tool/proposal.md +0 -21
- package/openspec/changes/add-mqa-quality-tool/specs/ckan-quality/spec.md +0 -71
- package/openspec/changes/add-mqa-quality-tool/tasks.md +0 -29
- package/openspec/changes/archive/2026-01-08-add-mcp-resources/design.md +0 -115
- package/openspec/changes/archive/2026-01-08-add-mcp-resources/proposal.md +0 -52
- package/openspec/changes/archive/2026-01-08-add-mcp-resources/specs/mcp-resources/spec.md +0 -92
- package/openspec/changes/archive/2026-01-08-add-mcp-resources/tasks.md +0 -56
- package/openspec/changes/archive/2026-01-08-expand-test-coverage-specs/design.md +0 -355
- package/openspec/changes/archive/2026-01-08-expand-test-coverage-specs/proposal.md +0 -161
- package/openspec/changes/archive/2026-01-08-expand-test-coverage-specs/tasks.md +0 -162
- package/openspec/changes/archive/2026-01-08-translate-project-to-english/proposal.md +0 -115
- package/openspec/changes/archive/2026-01-08-translate-project-to-english/specs/documentation-language/spec.md +0 -32
- package/openspec/changes/archive/2026-01-08-translate-project-to-english/tasks.md +0 -115
- package/openspec/changes/archive/2026-01-10-add-ckan-find-relevant-datasets/proposal.md +0 -17
- package/openspec/changes/archive/2026-01-10-add-ckan-find-relevant-datasets/specs/ckan-insights/spec.md +0 -7
- package/openspec/changes/archive/2026-01-10-add-ckan-find-relevant-datasets/tasks.md +0 -6
- package/openspec/changes/archive/2026-01-10-add-cloudflare-workers/design.md +0 -734
- package/openspec/changes/archive/2026-01-10-add-cloudflare-workers/proposal.md +0 -183
- package/openspec/changes/archive/2026-01-10-add-cloudflare-workers/specs/cloudflare-deployment/spec.md +0 -389
- package/openspec/changes/archive/2026-01-10-add-cloudflare-workers/tasks.md +0 -519
- package/openspec/changes/archive/2026-01-15-add-mcp-prompts/proposal.md +0 -13
- package/openspec/changes/archive/2026-01-15-add-mcp-prompts/specs/mcp-prompts/spec.md +0 -22
- package/openspec/changes/archive/2026-01-15-add-mcp-prompts/tasks.md +0 -10
- package/openspec/changes/archive/2026-01-15-add-mcp-resource-filters/proposal.md +0 -13
- package/openspec/changes/archive/2026-01-15-add-mcp-resource-filters/specs/mcp-resources/spec.md +0 -38
- package/openspec/changes/archive/2026-01-15-add-mcp-resource-filters/tasks.md +0 -10
- package/openspec/changes/archive/2026-01-19-update-repo-owner-ondata/proposal.md +0 -13
- package/openspec/changes/archive/2026-01-19-update-repo-owner-ondata/specs/repository-metadata/spec.md +0 -14
- package/openspec/changes/archive/2026-01-19-update-repo-owner-ondata/tasks.md +0 -12
- package/openspec/changes/archive/2026-01-19-update-search-parser-config/proposal.md +0 -13
- package/openspec/changes/archive/2026-01-19-update-search-parser-config/specs/ckan-insights/spec.md +0 -11
- package/openspec/changes/archive/2026-01-19-update-search-parser-config/specs/ckan-search/spec.md +0 -11
- package/openspec/changes/archive/2026-01-19-update-search-parser-config/tasks.md +0 -6
- package/openspec/changes/archive/add-automated-tests/design.md +0 -324
- package/openspec/changes/archive/add-automated-tests/proposal.md +0 -167
- package/openspec/changes/archive/add-automated-tests/specs/automated-testing/spec.md +0 -143
- package/openspec/changes/archive/add-automated-tests/tasks.md +0 -132
- package/openspec/project.md +0 -115
- package/openspec/specs/ckan-insights/spec.md +0 -23
- package/openspec/specs/ckan-search/spec.md +0 -16
- package/openspec/specs/cloudflare-deployment/spec.md +0 -344
- package/openspec/specs/documentation-language/spec.md +0 -32
- package/openspec/specs/mcp-prompts/spec.md +0 -26
- package/openspec/specs/mcp-resources/spec.md +0 -120
- package/openspec/specs/repository-metadata/spec.md +0 -19
- package/private/commenti-privati.yaml +0 -14
- package/testo.md +0 -12
- package/web-gui/PRD.md +0 -158
- package/web-gui/public/index.html +0 -883
- package/wrangler.toml +0 -6
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
# mcp-resources Specification
|
|
2
|
-
|
|
3
|
-
## Purpose
|
|
4
|
-
TBD - created by archiving change add-mcp-resources. Update Purpose after archive.
|
|
5
|
-
## Requirements
|
|
6
|
-
### Requirement: Dataset Resource Template
|
|
7
|
-
|
|
8
|
-
The system SHALL expose a resource template for accessing CKAN dataset metadata via the URI pattern `ckan://{server}/dataset/{id}`.
|
|
9
|
-
|
|
10
|
-
#### Scenario: Read dataset metadata successfully
|
|
11
|
-
|
|
12
|
-
- **WHEN** client reads `ckan://dati.gov.it/dataset/vaccini-covid`
|
|
13
|
-
- **THEN** server returns JSON with complete dataset metadata including title, description, resources, organization, tags
|
|
14
|
-
|
|
15
|
-
#### Scenario: Dataset not found
|
|
16
|
-
|
|
17
|
-
- **WHEN** client reads `ckan://demo.ckan.org/dataset/nonexistent-id`
|
|
18
|
-
- **THEN** server returns error indicating dataset not found
|
|
19
|
-
|
|
20
|
-
#### Scenario: Server unreachable
|
|
21
|
-
|
|
22
|
-
- **WHEN** client reads `ckan://invalid-server.example/dataset/test`
|
|
23
|
-
- **THEN** server returns error indicating server unreachable
|
|
24
|
-
|
|
25
|
-
### Requirement: Resource Resource Template
|
|
26
|
-
|
|
27
|
-
The system SHALL expose a resource template for accessing CKAN resource metadata via the URI pattern `ckan://{server}/resource/{id}`.
|
|
28
|
-
|
|
29
|
-
#### Scenario: Read resource metadata successfully
|
|
30
|
-
|
|
31
|
-
- **WHEN** client reads `ckan://dati.gov.it/resource/abc-123-def`
|
|
32
|
-
- **THEN** server returns JSON with resource metadata including name, format, URL, size, and download link
|
|
33
|
-
|
|
34
|
-
#### Scenario: Resource not found
|
|
35
|
-
|
|
36
|
-
- **WHEN** client reads `ckan://demo.ckan.org/resource/invalid-id`
|
|
37
|
-
- **THEN** server returns error indicating resource not found
|
|
38
|
-
|
|
39
|
-
### Requirement: Organization Resource Template
|
|
40
|
-
|
|
41
|
-
The system SHALL expose a resource template for accessing CKAN organization metadata via the URI pattern `ckan://{server}/organization/{name}`.
|
|
42
|
-
|
|
43
|
-
#### Scenario: Read organization metadata successfully
|
|
44
|
-
|
|
45
|
-
- **WHEN** client reads `ckan://dati.gov.it/organization/regione-toscana`
|
|
46
|
-
- **THEN** server returns JSON with organization metadata including title, description, and dataset count
|
|
47
|
-
|
|
48
|
-
#### Scenario: Organization not found
|
|
49
|
-
|
|
50
|
-
- **WHEN** client reads `ckan://demo.ckan.org/organization/nonexistent-org`
|
|
51
|
-
- **THEN** server returns error indicating organization not found
|
|
52
|
-
|
|
53
|
-
### Requirement: URI Scheme Parsing
|
|
54
|
-
|
|
55
|
-
The system SHALL parse `ckan://` URIs extracting server hostname and path components.
|
|
56
|
-
|
|
57
|
-
#### Scenario: Parse standard URI
|
|
58
|
-
|
|
59
|
-
- **WHEN** URI is `ckan://dati.gov.it/dataset/test-id`
|
|
60
|
-
- **THEN** server extracts: server=`https://dati.gov.it`, type=`dataset`, id=`test-id`
|
|
61
|
-
|
|
62
|
-
#### Scenario: Parse URI with www prefix
|
|
63
|
-
|
|
64
|
-
- **WHEN** URI is `ckan://www.dati.gov.it/dataset/test-id`
|
|
65
|
-
- **THEN** server extracts: server=`https://www.dati.gov.it`, type=`dataset`, id=`test-id`
|
|
66
|
-
|
|
67
|
-
#### Scenario: Reject malformed URI
|
|
68
|
-
|
|
69
|
-
- **WHEN** URI is `ckan://invalid` (missing path)
|
|
70
|
-
- **THEN** server returns validation error
|
|
71
|
-
|
|
72
|
-
### Requirement: Resource Response Format
|
|
73
|
-
|
|
74
|
-
The system SHALL return resource content as JSON with standard MCP resource response structure.
|
|
75
|
-
|
|
76
|
-
#### Scenario: JSON response structure
|
|
77
|
-
|
|
78
|
-
- **WHEN** client reads any valid resource URI
|
|
79
|
-
- **THEN** response contains `contents` array with `uri`, `mimeType` (application/json), and `text` (JSON string)
|
|
80
|
-
|
|
81
|
-
#### Scenario: Large response truncation
|
|
82
|
-
|
|
83
|
-
- **WHEN** resource content exceeds CHARACTER_LIMIT
|
|
84
|
-
- **THEN** response is truncated to CHARACTER_LIMIT with truncation indicator
|
|
85
|
-
|
|
86
|
-
### Requirement: Resource Discovery
|
|
87
|
-
The system SHALL list available resource templates when client requests resource list, including dataset, resource, organization, and dataset filter templates (group, organization, tag, format).
|
|
88
|
-
|
|
89
|
-
#### Scenario: List resource templates
|
|
90
|
-
- **WHEN** client calls `resources/listTemplates`
|
|
91
|
-
- **THEN** server returns list of available URI templates with descriptions, including the dataset filter templates
|
|
92
|
-
|
|
93
|
-
### Requirement: Group Datasets Resource Template
|
|
94
|
-
The system SHALL expose a resource template for accessing CKAN datasets by group via the URI pattern `ckan://{server}/group/{name}/datasets`.
|
|
95
|
-
|
|
96
|
-
#### Scenario: Read datasets by group
|
|
97
|
-
- **WHEN** client reads `ckan://dati.gov.it/group/governo/datasets`
|
|
98
|
-
- **THEN** server returns JSON with the matching datasets from `package_search`
|
|
99
|
-
|
|
100
|
-
### Requirement: Organization Datasets Resource Template
|
|
101
|
-
The system SHALL expose a resource template for accessing CKAN datasets by organization via the URI pattern `ckan://{server}/organization/{name}/datasets`.
|
|
102
|
-
|
|
103
|
-
#### Scenario: Read datasets by organization
|
|
104
|
-
- **WHEN** client reads `ckan://dati.gov.it/organization/regione-toscana/datasets`
|
|
105
|
-
- **THEN** server returns JSON with the matching datasets from `package_search`
|
|
106
|
-
|
|
107
|
-
### Requirement: Tag Datasets Resource Template
|
|
108
|
-
The system SHALL expose a resource template for accessing CKAN datasets by tag via the URI pattern `ckan://{server}/tag/{name}/datasets`.
|
|
109
|
-
|
|
110
|
-
#### Scenario: Read datasets by tag
|
|
111
|
-
- **WHEN** client reads `ckan://dati.gov.it/tag/turismo/datasets`
|
|
112
|
-
- **THEN** server returns JSON with the matching datasets from `package_search`
|
|
113
|
-
|
|
114
|
-
### Requirement: Format Datasets Resource Template
|
|
115
|
-
The system SHALL expose a resource template for accessing CKAN datasets by resource format via the URI pattern `ckan://{server}/format/{format}/datasets`.
|
|
116
|
-
|
|
117
|
-
#### Scenario: Read datasets by format
|
|
118
|
-
- **WHEN** client reads `ckan://dati.gov.it/format/csv/datasets`
|
|
119
|
-
- **THEN** server returns JSON with the matching datasets from `package_search` filtered by resource format
|
|
120
|
-
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# repository-metadata Specification
|
|
2
|
-
|
|
3
|
-
## Purpose
|
|
4
|
-
TBD - created by archiving change update-repo-owner-ondata. Update Purpose after archive.
|
|
5
|
-
## Requirements
|
|
6
|
-
### Requirement: Canonical repository ownership references
|
|
7
|
-
The project documentation and UI MUST reference the canonical repository under the ondata organization once the repository is migrated.
|
|
8
|
-
|
|
9
|
-
#### Scenario: Repository references updated
|
|
10
|
-
- **WHEN** a user follows documentation or UI links to the repository
|
|
11
|
-
- **THEN** the links point to the ondata organization repository URL
|
|
12
|
-
|
|
13
|
-
### Requirement: NPM package ownership remains personal
|
|
14
|
-
The project MUST continue to document the npm package under the @aborruso scope unless an explicit npm ownership change is approved.
|
|
15
|
-
|
|
16
|
-
#### Scenario: npm install instructions unchanged
|
|
17
|
-
- **WHEN** a user follows installation instructions
|
|
18
|
-
- **THEN** the package name remains @aborruso/ckan-mcp-server
|
|
19
|
-
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
# File YAML per commenti privati su ckan-mcp-server
|
|
2
|
-
# Ogni elemento rappresenta un commento ricevuto
|
|
3
|
-
- autore: Giovanni Pirrotta
|
|
4
|
-
data: 2026-01-19
|
|
5
|
-
modalità: telegram
|
|
6
|
-
testo: >
|
|
7
|
-
Ciao Andy, se non lo hai già fatto secondo me dovresti contattare AGID. È uno strumento così potente da meritare massima visibilità, non solo per le PA, ma soprattutto per chi oggi fa fatica a trovare dati o a interagire con i portali opendata. Vedo grandissime potenzialità!!
|
|
8
|
-
- autore: Matteo Fortini
|
|
9
|
-
data: 2026-01-18
|
|
10
|
-
modalità: call
|
|
11
|
-
testo: |
|
|
12
|
-
Ho visto il video, molto interessante, lo proverò e lo racconterò.
|
|
13
|
-
Ti confesso che quando vedo queste cose mi chiedo se si possa implementare un meccanismo di feedback per ottenere lo stesso risultato con meno risorse. Intendo "come miglioreresti questo sito/API per renderlo più efficiente per queste cose?"
|
|
14
|
-
In generale a me piacerebbe che la IA pian piano venisse usata per "oliare" le interazioni, adesso la stiamo usando come una schiava per fare le cose scomode
|
package/testo.md
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# Appunti sul testo di racconto
|
|
2
|
-
|
|
3
|
-
<!-- Qui puoi prendere appunti, idee, bozze per il testo di racconto -->
|
|
4
|
-
|
|
5
|
-
# Idee
|
|
6
|
-
|
|
7
|
-
- l'MCP non è intelligente, per definizione, quindi dipende dal motore con cui l'accoppi
|
|
8
|
-
- le interfacce dei portali molto raramente espongono una GUI per sfruttare le tante combinazioni e modalità di query che è possibile fare
|
|
9
|
-
- il ranking si può fare un po' sui metadati e in ogni caso dipende da solr, quasi mai ci sono contenuti indicizzati
|
|
10
|
-
- la cosa bella di poterlo usare nell'AI e fargli richieste per sinonimi (es. hotel → alberghi, strutture ricettive, ospitalità, ecc.)
|
|
11
|
-
- è possibile cercare in tutte le lingue: puoi parlare in inglese, chiedere di cercare "restaurant", dire che il portale è in italiano e l'AI ci penserà lui a fare la query giusta e descriverti nella tua lingua i risultati
|
|
12
|
-
|
package/web-gui/PRD.md
DELETED
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
# CKAN Open Data Explorer
|
|
2
|
-
|
|
3
|
-
**Versione**: 1.0
|
|
4
|
-
**Data**: 25 luglio 2024
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## 1. Introduzione
|
|
9
|
-
|
|
10
|
-
"CKAN Open Data Explorer" è un'applicazione web frontend progettata per facilitare l'interazione con portali Open Data basati su CKAN, sfruttando un'interfaccia di chat in linguaggio naturale potenziata dall'API Gemini. L'obiettivo principale è rendere l'esplorazione dei dataset e delle risorse Open Data più accessibile e intuitiva per gli utenti, eliminando la necessità di navigare direttamente le interfacce complesse dei portali CKAN o di formulare query API specifiche.
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## 2. Obiettivi del Prodotto
|
|
15
|
-
|
|
16
|
-
- **Semplificare l'accesso ai dati**: Permettere agli utenti di trovare e comprendere i dataset Open Data utilizzando domande e comandi in linguaggio naturale
|
|
17
|
-
- **Migliorare l'esperienza utente**: Fornire un'interfaccia conversazionale fluida e reattiva che guida l'utente attraverso il processo di ricerca dati
|
|
18
|
-
- **Abilitare l'interazione tool-driven**: Utilizzare il modello Gemini per orchestrare chiamate a un server MCP (Microservice Controller Proxy) che a sua volta interagisce con i portali CKAN
|
|
19
|
-
- **Gestire errori comuni**: Fornire feedback chiari e gestibili per errori di connessione al server MCP o problemi di quota dell'API Gemini
|
|
20
|
-
- **Configurabilità**: Consentire agli utenti di configurare l'endpoint del server MCP per adattarsi a diversi ambienti o istanze
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## 3. Utenti Target / Personas
|
|
25
|
-
|
|
26
|
-
- **Ricercatori e Analisti Dati (Principianti)**: Cercano dati specifici ma non hanno familiarità con le API CKAN o la navigazione approfondita dei portali
|
|
27
|
-
- **Giornalisti o Cittadini Curiosi**: Vogliono esplorare i dati pubblici per storie o interessi personali senza barriere tecniche
|
|
28
|
-
- **Sviluppatori (per testing)**: Potrebbero usarlo per testare il funzionamento del server MCP o per esplorare la capacità di Gemini di interpretare le richieste utente e tradurle in chiamate a tool
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## 4. Funzionalità
|
|
33
|
-
|
|
34
|
-
### 4.1 Interfaccia di Chat in Linguaggio Naturale
|
|
35
|
-
|
|
36
|
-
**Input Messaggi**:
|
|
37
|
-
- Campo di testo per l'utente per digitare domande e comandi
|
|
38
|
-
- Supporta l'invio tramite tasto Invio o un pulsante dedicato
|
|
39
|
-
|
|
40
|
-
**Display Messaggi**:
|
|
41
|
-
- Messaggi dell'utente visualizzati con sfondo grigio chiaro e testo nero
|
|
42
|
-
- Messaggi dell'assistente visualizzati con sfondo bianco
|
|
43
|
-
- Supporto per il rendering Markdown (tramite react-markdown e remark-gfm)
|
|
44
|
-
- Icone chiare (User, Bot) per distinguere il mittente
|
|
45
|
-
|
|
46
|
-
**Comportamenti**:
|
|
47
|
-
- Scroll automatico verso il basso per mostrare l'ultimo messaggio
|
|
48
|
-
- Messaggio di benvenuto iniziale per guidare l'utente
|
|
49
|
-
- Suggerimenti di query iniziali per aiutare gli utenti a iniziare
|
|
50
|
-
|
|
51
|
-
### 4.2 Integrazione con Gemini API per NLU e Tool Calling
|
|
52
|
-
|
|
53
|
-
- **Orchestrazione Gemini**: L'API Gemini (gemini-3-pro-preview) viene utilizzata per comprendere le intenzioni dell'utente e decidere quali tool dell'MCP chiamare
|
|
54
|
-
- **System Instruction**: Istruzione di sistema personalizzata che guida Gemini a comportarsi come "esperto assistente Open Data specializzato in portali CKAN" con regole rigide per l'utilizzo dei tool e la gestione degli errori CKAN
|
|
55
|
-
- **Tool Calling**: Gemini identifica e formatta le chiamate ai tool (search_datasets, get_dataset) basandosi sul inputSchema fornito dal server MCP
|
|
56
|
-
- **Ciclo di Tool Execution**: L'applicazione gestisce un ciclo di esecuzione dei tool, inviando le risposte dei tool a Gemini per ulteriori elaborazioni e generazioni di risposte in linguaggio naturale
|
|
57
|
-
- **Visualizzazione Tool in Uso**: Durante l'esecuzione di un tool, viene visualizzato un messaggio "Utilizzo tool: [nome_tool]" con icona di caricamento e parametri JSON della chiamata tool (con break-all per adattamento a tutti i dispositivi)
|
|
58
|
-
|
|
59
|
-
### 4.3 Integrazione con MCP (Microservice Controller Proxy)
|
|
60
|
-
|
|
61
|
-
- **Endpoint Configurable**: L'URL del server MCP è configurabile tramite interfaccia utente dedicata (sezione "Impostazioni")
|
|
62
|
-
- **Salute del Server**: Indicatore di stato che mostra se il server MCP è online, offline o in fase di verifica (CheckCircle2, XCircle, RefreshCw)
|
|
63
|
-
- **Fallback Tool Definitions**: Se il server MCP non è raggiungibile, l'applicazione usa definizioni di tool di fallback per mantenere funzionalità minima
|
|
64
|
-
- **Chiamate JSON-RPC**: Il servizio mcp.ts gestisce le chiamate JSON-RPC per listare i tool (tools/list) e chiamare i tool specifici (tools/call)
|
|
65
|
-
- **Gestione CORS**: Include logica di fallback utilizzando proxy corsproxy.io se la richiesta diretta fallisce
|
|
66
|
-
- **Output Tool**: L'output JSON dei tool viene parsato e visualizzato nella chat, con rendering specifico per DatasetCard
|
|
67
|
-
|
|
68
|
-
### 4.4 Visualizzazione Dati (DatasetCard)
|
|
69
|
-
|
|
70
|
-
- **Card Dettagli Dataset**: Quando Gemini restituisce risultati di dataset, questi vengono visualizzati come DatasetCard con informazioni chiave: titolo, descrizione, data di creazione, autore, licenza, tag e elenco di risorse (con link esterni)
|
|
71
|
-
- **Formattazione**: Date formattate in modo leggibile, link alle risorse chiaramente distinguibili
|
|
72
|
-
- **Troncamento**: Viene mostrato un numero limitato di risorse con messaggio "Mostrati i primi X risultati" se ce ne sono di più
|
|
73
|
-
|
|
74
|
-
### 4.5 Gestione Errori e Feedback Utente
|
|
75
|
-
|
|
76
|
-
**Errori Gemini API**:
|
|
77
|
-
- Gestione specifica degli errori di quota (RESOURCE_EXHAUSTED, codice 429)
|
|
78
|
-
- Banner di avviso (AlertTriangle) in caso di quota esaurita
|
|
79
|
-
- Istruzione per selezionare chiave API da progetto a pagamento con link alla documentazione di fatturazione
|
|
80
|
-
- Pulsante per aprire il selettore di chiavi API (se window.aistudio.openSelectKey disponibile)
|
|
81
|
-
|
|
82
|
-
**Errori MCP**:
|
|
83
|
-
- Messaggi di errore chiari se il server MCP non è raggiungibile o se una chiamata tool fallisce (es. Status 404)
|
|
84
|
-
- Incoraggiamento a controllare l'URL dell'MCP nelle impostazioni
|
|
85
|
-
|
|
86
|
-
**Stati di Caricamento**:
|
|
87
|
-
- Indicatore "Gemini sta elaborando..." al centro dello schermo quando l'API Gemini è attiva ma non sta chiamando un tool
|
|
88
|
-
- Indicatore "Utilizzo tool: [nome_tool]" quando un tool MCP è in esecuzione
|
|
89
|
-
- Pulsante di invio disabilitato durante il caricamento, se l'input è vuoto, o se l'MCP è offline
|
|
90
|
-
|
|
91
|
-
### 4.6 Configurabilità
|
|
92
|
-
|
|
93
|
-
- **Sezione Impostazioni**: Icona Settings apre un pannello dove l'utente può visualizzare e modificare l'endpoint del server MCP e la propria API key di Gemini
|
|
94
|
-
- **Salvataggio Endpoint**: Pulsante Applica salva il nuovo endpoint e verifica immediatamente la connettività MCP
|
|
95
|
-
- **Gestione API Key**: L'utente inserisce la propria API key di Gemini tramite interfaccia dedicata (campo di input protetto). La chiave viene salvata nel browser storage (localStorage) e rimane disponibile per le sessioni successive
|
|
96
|
-
|
|
97
|
-
---
|
|
98
|
-
|
|
99
|
-
## 5. Requisiti Tecnici
|
|
100
|
-
|
|
101
|
-
### Frontend
|
|
102
|
-
|
|
103
|
-
- **Framework**: React 19 (tramite react/)
|
|
104
|
-
- **Linguaggio**: TypeScript
|
|
105
|
-
- **Styling**: Tailwind CSS (con plugin typography) per design moderno e responsivo
|
|
106
|
-
- **Icone**: Lucide React (lucide-react) per interfaccia visivamente accattivante
|
|
107
|
-
- **Rendering Markdown**: react-markdown con remark-gfm per rendering robusto del testo generato da Gemini
|
|
108
|
-
- **Gestione Moduli**: Utilizzo di importmap in index.html per caricamento diretto dei moduli ES6
|
|
109
|
-
|
|
110
|
-
### Backend (Implicito)
|
|
111
|
-
|
|
112
|
-
- **Gemini API**: Comunicazione con gemini-3-pro-preview tramite @google/genai SDK
|
|
113
|
-
- **MCP Server**: Interazione con un server MCP (es. ckan-mcp-server.andy-pr.workers.dev/mcp) che espone API JSON-RPC
|
|
114
|
-
- **API Key Management**: L'API key di Gemini è inserita dall'utente tramite l'interfaccia di impostazioni. La chiave viene salvata in localStorage e recuperata in ogni sessione. Supporta anche process.env.API_KEY come fallback per ambienti di sviluppo. Include meccanismo per interagire con window.aistudio.openSelectKey() per selezione di chiave API a pagamento
|
|
115
|
-
- **Error Handling**: Gestione robusta di errori HTTP, errori JSON-RPC e errori specifici dell'API Gemini
|
|
116
|
-
|
|
117
|
-
---
|
|
118
|
-
|
|
119
|
-
## 6. Requisiti Non Funzionali
|
|
120
|
-
|
|
121
|
-
### Performance
|
|
122
|
-
|
|
123
|
-
- Caricamento rapido dell'interfaccia utente
|
|
124
|
-
- Risposte della chat ottimizzate per la velocità, minimizzando la latenza delle chiamate API
|
|
125
|
-
- Scroll fluido della chat, anche con molti messaggi
|
|
126
|
-
|
|
127
|
-
### Usabilità (UX)
|
|
128
|
-
|
|
129
|
-
- Interfaccia intuitiva e facile da usare per utenti di tutti i livelli tecnici
|
|
130
|
-
- Feedback visivo chiaro per stati di caricamento, errori e successo delle operazioni
|
|
131
|
-
- Messaggi di errore comprensibili e azioni suggerite
|
|
132
|
-
|
|
133
|
-
### Reattività
|
|
134
|
-
|
|
135
|
-
L'applicazione deve essere completamente responsiva e funzionare bene su desktop, tablet e dispositivi mobili
|
|
136
|
-
|
|
137
|
-
### Accessibilità (A11Y)
|
|
138
|
-
|
|
139
|
-
- Utilizzo di elementi HTML semantici
|
|
140
|
-
- Contrasto colori adeguato
|
|
141
|
-
- Navigazione da tastiera e supporto per lettori di schermo (da verificare e migliorare)
|
|
142
|
-
|
|
143
|
-
### Compatibilità Cross-browser
|
|
144
|
-
|
|
145
|
-
Funzionalità e aspetto devono essere coerenti sui principali browser moderni (Chrome, Firefox, Safari, Edge)
|
|
146
|
-
|
|
147
|
-
### Sicurezza
|
|
148
|
-
|
|
149
|
-
- La chiave API di Gemini è gestita tramite variabili d'ambiente e non esposta nel codice sorgente lato client
|
|
150
|
-
- Il CORS proxy è usato come fallback, ma si raccomanda che il server MCP gestisca il CORS direttamente per maggiore sicurezza
|
|
151
|
-
|
|
152
|
-
### Internazionalizzazione
|
|
153
|
-
|
|
154
|
-
Attualmente l'interfaccia è interamente in italiano
|
|
155
|
-
|
|
156
|
-
### Offline Functionality
|
|
157
|
-
|
|
158
|
-
L'applicazione richiede una connessione internet attiva sia per l'API Gemini che per il server MCP, quindi non supporta la funzionalità offline
|