{
  "markdown": "[![PyPI version](https://img.shields.io/pypi/v/openrndt)](https://pypi.org/project/openrndt/)\n[![GitHub](https://img.shields.io/badge/github-ondata%2Fopenrndt-blue?logo=github)](https://github.com/ondata/openrndt)\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/ondata/openrndt)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Newsletter](https://img.shields.io/badge/newsletter-ondata-FF6719?logo=substack)](https://ondata.substack.com/)\n\n# openrndt\n\n> **Nota:** strumento in evoluzione — aiutaci a migliorarlo [aprendo issue](https://github.com/ondata/openrndt/issues) o condividendo feedback.\n\nCLI Python e libreria per accedere al **Repertorio Nazionale dei Dati Territoriali (RNDT)** —\npensata per essere orchestrata da un'AI.\n\n**Il modo giusto di trovare dati territoriali con l'AI.** I modelli linguistici capiscono bene le domande, ma inventano nomi di dataset e URL di servizi WMS/WFS che non esistono. Il pattern corretto è usare l'AI per *comporre interrogazioni al catalogo ufficiale*, non per generare i riferimenti. openrndt è il layer di esecuzione di quel pattern: l'AI decide cosa cercare, openrndt interroga il RNDT e restituisce metadati e URL reali, verificabili.\n\n> **Al meglio con un'AI.** openrndt funziona benissimo da solo, ma **dà il massimo se guidato da un agente AI**: la CLI è progettata per essere composta, interrogata e orchestrata passo passo. Per un'esperienza guidata — scoperta delle codelist, ricerca con filtri progressivi, dettaglio del metadato, risorse scaricabili — abbinala alla Agent Skill [`rndt-explorer`](https://github.com/ondata/openrndt/blob/main/skills/rndt-explorer/SKILL.md) inclusa in questo repo. I principi di design sono nella sezione [Per agenti AI](#per-agenti-ai).\n\n> Stato: v2.0 — read-only.\n\n## Cos'è il RNDT\n\nIl [Repertorio Nazionale dei Dati Territoriali](https://geodati.gov.it/geoportale/) è\nil catalogo ufficiale italiano dei metadati geografici (ISO 19115/19139). Espone REST\nAPI per cercare e scaricare i metadati.\n\n## Installazione\n\n### Da PyPI\n\n```bash\nuv tool install openrndt\n# oppure, senza installazione persistente:\nuvx openrndt --help\n```\n\n### Da locale (per sviluppo o versioni non ancora pubblicate)\n\n```bash\ngit clone https://github.com/ondata/openrndt.git\ncd openrndt\n\n# CLI globale: venv isolato, eseguibile in PATH\nuv tool install .\n\n# Aggiornamento dopo modifiche al codice\nuv tool install --reinstall .\n\n# Disinstallazione\nuv tool uninstall openrndt\n```\n\n### Per sviluppo (modifiche con ricarica immediata)\n\n```bash\ngit clone https://github.com/ondata/openrndt.git\ncd openrndt\nuv sync\nuv run openrndt --help\n```\n\n## Uso\n\n```bash\n# Ricerca testuale\nopenrndt search --q \"catasto\" --num 5\n\n# Filtro per bounding box (Piemonte sud)\nopenrndt search --q \"cartografia\" --bbox 7,44,8,45 --num 10\n\n# Profilo GIS (campi essenziali). Senza --format l'output diventa una tabella\nopenrndt search --q \"catasto\" --profile gis --num 10\n\n# Profilo QGIS (CSV con colonne URL servizi + bbox separata)\nopenrndt --format csv search --q \"catasto\" --profile qgis --num 10\n\n# Cosa pubblica un ente (campo analizzato: case-insensitive)\nopenrndt search --org \"comune di torino\" --num 10\n\n# Filtri temporali avanzati (aggiornamento + pubblicazione)\nopenrndt search --q \"catasto\" --updated-from 2024-01-01 --published-from 2020-01-01 --num 10\n\n# Export footprint bbox in GeoJSON (EPSG:4326)\nopenrndt footprints --q \"catasto\" --num 50 > footprints.geojson\n\n# Per categoria tematica ISO 19115\nopenrndt search --data-category planningCadastre --num 5\n\n# Singolo metadato (documento normalizzato: contatto, bbox, lineage, risorse)\nopenrndt get age:D_E973_MARSAGLIA\n\n# Lo stesso metadato come busta Elasticsearch grezza\nopenrndt get age:D_E973_MARSAGLIA --raw\n\n# Estrai e verifica endpoint WMS/WFS/download di un metadato\nopenrndt resources age:D_E973_MARSAGLIA\n\n# XML ISO 19139 grezzo\nopenrndt get age:D_E973_MARSAGLIA --xml > meta.xml\n\n# Codelist disponibili (no rete)\nopenrndt discover\n```\n\nDalla 3.3.0 `get` con `--format json` (il default) non restituisce più la sola\nbusta Elasticsearch: costruisce un documento con lo stesso vocabolario delle\nrisposte di `search` (`id`, `title`, `org`, `type`, `category`, `updated`,\n`indexed`, `open`, `license`, `url`) più i campi che servono a usare davvero la\nscheda: `data_date` (la data del **dato**, non della scheda), `contact`\n(`{name, email, website}` del punto di contatto designato), `bbox`\n(`{xmin, ymin, xmax, ymax}`), `lineage` e `resources` (le risorse fruibili già\ntipizzate e deduplicate, come `resources --no-check`).\n\nLa modifica è additiva: `_source` e i flag della busta (`_index`, `_id`,\n`_version`, `found`, …) restano in coda con gli stessi valori di prima, quindi\nogni `jq` scritto per le versioni precedenti continua a funzionare. `--raw`\nrestituisce la sola busta, com'era ante 3.3.0.\n\n```bash\nopenrndt get age:D_E973_MARSAGLIA | jq '{data_date, email: .contact.email, bbox}'\n```\n\nLa bbox viene controllata prima della chiamata: quattro valori numerici, longitudini\nfra -180 e 180, latitudini fra -90 e 90, `xmin < xmax` e `ymin < ymax`. Una bbox\nmalformata esce con codice 2 e un messaggio esplicito, invece di essere ignorata\ndall'API e restituire l'intero catalogo:\n\n```bash\nopenrndt search --bbox \"11.2,44.4,11.5\"\n# `bbox` richiede quattro valori xmin,ymin,xmax,ymax (ricevuti 3: '11.2,44.4,11.5').\n```\n\nIl timeout HTTP per singolo tentativo è configurabile con `--timeout` (default 30s);\ncon i retry su timeout/5xx (3 tentativi) il caso peggiore è ~3x questo valore:\n\n```bash\nopenrndt --timeout 5 search --q \"catasto\" --num 5\n```\n\nPer sapere quale versione è installata:\n\n```bash\nopenrndt --version\n```\n\nTutti i comandi accettano `--format json` (default), `--format table`, `--format csv`.\nUnica eccezione al default: `search --profile ...` senza `--format` esplicito esce\nin `table`, dato che i preset di colonne valgono solo per gli output tabellari.\nPer `search` c'è anche `--format compact`: una riga NDJSON per record con i soli\ncampi ad alto segnale (`id`, `title`, `org`, `type`, `category`, `updated`,\n`indexed`, `open`, `license`, `url`, `resources`, `email`, `download`), pensata\nper agenti AI e pipe a basso consumo di token:\n\n```bash\nopenrndt --format compact search --q \"stato chimico dei fiumi\" --num 3\n```\n\nEcco una riga reale (uno dei tre record):\n\n```\n{\"id\": \"arpa_ve:StatoChimicoFiumi_DGR1856\", \"title\": \"Stato chimico fiumi 2010-2013 (DGR 1856/2015)\", \"org\": \"ARPAV - U.O. Transizione Digitale e ICT\", \"type\": \"dataset\", \"category\": \"inlandWaters\", \"updated\": \"2017-12-20T00:00:00Z\", \"indexed\": \"2026-04-25T15:55:59.587Z\", \"open\": false, \"license\": null, \"url\": \"https://geodati.gov.it/geoportal-catalog/rest/metadata/item/arpa_ve%3AStatoChimicoFiumi_DGR1856/html\", \"resources\": [\"WFS\", \"WMS\"]}\n```\n\n`email` è l'indirizzo del punto di contatto designato della scheda e `download`\nla lista degli URL di download dichiarati (`url_download_s` e\n`url_http_download_s`, riportati come sono: il RNDT ci mette anche endpoint che\ndownload diretti non sono). Insieme rispondono alle due domande che vengono\nsubito dopo una ricerca: chi contatto, e da dove scarico.\n\n`open`, `license` e `url` servono a chi deve riusare o citare il dato. `open` e\n`license` riportano quello che l'ente ha dichiarato nel campo `isOpendata`, senza\nnormalizzarlo: `license` può essere `CC BY 4.0` come un intero paragrafo di\ndisclaimer, e `open: false` significa che l'ente non l'ha dichiarato lì, non che\nil dato sia chiuso (misurato su 3000 record: il campo è presente sul 72%, che\nscende al 55% escludendo l'Agenzia delle Entrate, e in un terzo dei casi contiene\nil solo marcatore `opendata`). `url` è il permalink della scheda sul portale, da\nmettere in nota quando si cita la fonte. In `--format table` `url` non viene\nstampata, `open` esce come sì/no e `license` è troncata: in `csv` e `compact`\nrestano intere.\n\n`updated` è la data della **scheda di metadato** (`apiso_Modified_dt`), la stessa\nsu cui filtrano `--updated-from/--updated-to`; `indexed` è l'istante in cui il\ncatalogo ha indicizzato il record (`sys_modified_dt`) e non dice nulla né sul dato\nné sulla scheda. Attenzione se leggi il JSON grezzo dell'API (`--format json`):\nlì il campo top-level `updated` è quello di indicizzazione, mentre la data della\nscheda sta in `_source.apiso_Modified_dt`.\n\n### Ricerca per ente\n\n`--org` cerca la frase su `apiso_OrganizationName_txt`, campo analizzato: non\nconta il maiuscolo, né l'ordine dei token, né gli apostrofi.\n\n```bash\nopenrndt search --org \"comune di torino\" --num 5      # 269 record, solo Comune di Torino\nopenrndt search --org-exact \"Comune di Torino\"        # confronto esatto su EnteResponsabile_s\n```\n\nEvita le wildcard su `contact_organizations_s`: sono case-sensitive\n(`*bologna*` → 0, `*Bologna*` → 112) e pescano ogni record che *nomina* quel\nterritorio, anche di altri enti.\n\nSe `--org` non trova nulla, la CLI interroga il catalogo e ti mostra i nomi di\nente realmente presenti che somigliano a quello cercato — utile perché molti\ncomuni non pubblicano in proprio e i loro dati stanno sotto un ente\nsovraordinato:\n\n```\n$ openrndt search --org \"comune di bologna\"\nNessun risultato per la ricerca.\nSuggerimenti: enti simili presenti in catalogo: Citta' metropolitana di Bologna | Regione Emilia-Romagna\n```\n\nSe `resources` è `[]` il record non linka servizi fruibili: recupera il\ndettaglio con `get <id>` e guarda `_source.links_s` (spesso il download è\ndietro un portale dell'ente, non un link diretto).\n\n## Esempi verificati\n\nTutti gli esempi qui sotto sono stati **eseguiti live contro il catalogo reale** il\n2026-08-09: i comandi riportano output veri, gli URL rispondono 200, i layer\nesistono. I totali cambiano perché il catalogo cresce — sono il conteggio di quel\ngiorno, non una promessa.\n\n### 1. Dal tema al GeoPackage: dati vettoriali scaricati in ~5 secondi\n\n> Il caso più comune per un tecnico GIS: serve il dato, non il metadato.\n\n```bash\n# 1. trova il record con un servizio WFS (la colonna resources lo dice subito)\nopenrndt --format compact search --q \"stato chimico dei fiumi\" --num 3\n# → arpa_ve:Stato_Chimico_Fiumi_DGR_3_2022 … resources: [\"WFS\", \"WMS\"]\n\n# 2. estrai gli endpoint del record\nopenrndt --format json resources arpa_ve:Stato_Chimico_Fiumi_DGR_3_2022 --no-check\n# WFS  http://gaia.arpa.veneto.it/geoserver/ows?service=WFS&version=1.0.0&request=GetCapabilities\n# WMS  http://gaia.arpa.veneto.it/geoserver/ows?service=wms&version=1.3.0&request=GetCapabilities\n\n# 3. scarica il layer vettoriale in GeoPackage (open source, apribile in QGIS)\nogr2ogr -f GPKG stato_fiumi.gpkg \\\n  \"WFS:https://gaia.arpa.veneto.it/geoserver/ows?service=WFS&version=1.0.0&request=GetCapabilities\" \\\n  geonode:Stato_Chimico_Fiumi_DGR_3_2022 -nlt PROMOTE_TO_MULTI\n# → stato_fiumi.gpkg (585 KB) pronto per QGIS, in ~2 secondi\n```\n\nNota onesta: la scheda cataloga l'endpoint in `http`, il servizio risponde con un\nredirect a `https` che `ogr2ogr` segue da solo (per questo `resources` senza\n`--no-check` segnala `301`, non `200`).\n\n### 2. L'uso del suolo in QGIS: un WMS con 7 annate (più il 1853)\n\n> Un solo URL da incollare in QGIS per avere l'uso del suolo dell'Emilia-Romagna\n> dal 1976 a oggi, e in più l'uso storico del 1853.\n\n```bash\nopenrndt search --q \"uso del suolo WMS\" --num 20\n```\n\nIl record `r_emiro:2016-04-01T154419` (\"Uso del Suolo (WMS)\") pubblica:\n\n```\nhttp://servizigis.regione.emilia-romagna.it/wms/uso_del_suolo?request=GetCapabilities&service=WMS\n```\n\nIn QGIS: *Aggiungi layer WMS/WMTS* → questo URL. I layer coprono le annate\n2020, 2017, 2014, 2008, 2003, 1994, 1976 più l'uso storico 1853 (punti e\npoligoni) — confermato dal GetCapabilities del servizio.\n\n### 3. Il catasto urbano come layer: WMS del Comune di Torino\n\n```bash\nopenrndt search --q \"catasto\" --num 10\n```\n\nTra i risultati c'è il *Catasto Urbano 1:1500 - Geo-servizio WMS* con URL\nverificato (HTTP 200):\n\n```\nhttps://geomap.reteunitaria.piemonte.it/ws/siccms/coto-01/wmsg01/wms_sicc17bis_catasto_urbano?service=WMS&version=1.1.1&request=getCapabilities\n```\n\n### 4. Le ortofoto più fresche d'Italia: la 2024 di Regione Lombardia\n\n```bash\nopenrndt --format csv search --q \"ortofoto\" --profile qgis --num 100\n```\n\nIl profilo `qgis` produce un CSV con la colonna `wms_url` già pronta: qui sotto\ntre servizi verificati (HTTP 200) da incollare in QGIS:\n\n| Ente | Dato | URL WMS |\n|---|---|---|\n| Regione Lombardia | Ortofoto 2024 | `https://www.cartografia.servizirl.it/arcgis5/services/BaseMap/Ortofoto2024/ImageServer/WMSServer?request=GetCapabilities&service=WMS` |\n| Regione Sardegna | Ortofoto | `https://webgis.regione.sardegna.it/geoserverraster/ows?service=wms&version=1.3.0&request=GetCapabilities` |\n| Regione Piemonte | Ortofoto (mapproxy) | `https://geomap.reteunitaria.piemonte.it/mapproxy/service?service=WMS&version=1.3.0&request=getCapabilities` |\n\n### 5. Il reticolo idrografico in vettoriale (non un'immagine)\n\n> Per interrogare e modificare i dati serve un WFS, non un WMS.\n\n```bash\nopenrndt --format compact search --q \"reticolo idrografico\" --num 50\n```\n\nDue servizi verificati (HTTP 200, risposta in ~3s):\n\n- **ARPA Veneto** — `http://gaia.arpa.veneto.it/geoserver/ows?service=WFS&version=1.0.0&request=GetCapabilities`\n- **ISPRA** — `http://sdi.isprambiente.it/geoserver/hy/wfs?service=wfs&version=2.0.0&request=GetCapabilities`\n\nIn QGIS: *Aggiungi layer WFS* → URL → scegli il feature type. Da CLI, lo stesso\nflusso dell'esempio 1 (`ogr2ogr`) scarica il layer in GeoPackage.\n\n### 6. Tutti i WMS di un tema INSPIRE in 10 secondi\n\n> Quanti servizi WMS pubblicano gli enti italiani su un tema? Un one-liner.\n\n```bash\nopenrndt --format json search --q 'INSPIRETheme_s:Idrografia' --num 862 \\\n  | jq -r '.results[].links[]? | select(.dctype==\"WMS\") | .href' | sort -u > wms_idrografia.txt\nwc -l wms_idrografia.txt\n# 108 endpoint WMS unici, estratti in ~10 secondi\n```\n\n### 7. Cosa copre la mia area di studio\n\n> Bounding box + parola chiave: dalla cartografia odierna al Ducato di Modena 1821.\n\n```bash\nopenrndt --format json search --q \"edificato\" --bbox \"11.2,44.4,11.5,44.6\" --num 10\n# total: 44 (2026-08-09)\n```\n\nNel riquadro bolognese ci sono il Database Topografico Regionale (edifici,\nunità volumetriche, falde) **e** cartografie storiche esposte come WMS,\nper esempio:\n\n```\nCarta storica del Ducato di Modena - 1821 (WMS)\n→ https://servizigis.regione.emilia-romagna.it/wms/Ducato_modena_1821?request=GetCapabilities&service=WMS   (HTTP 200)\n```\n\nNota: il filtro bbox è per *sovrapposizione*: include i dataset a copertura\nregionale che toccano l'area (per questo il totale è 44, non \"quelli di Bologna\").\n\n### 8. I dati del mio comune: 4 dataset, con il contatto per il riuso\n\n> Il caso dell'ufficio comunale: cosa pubblica chi gestisce il mio territorio,\n> e a chi scrivere per il riuso.\n\n```bash\nopenrndt --format compact search \\\n  --q \"(Bologna OR bolognese) AND AmbitoTerritoriale_s:Locale\" \\\n  --bbox 11.2,44.4,11.5,44.6 --num 10\n# total: 4 — tutti della Città metropolitana di Bologna:\n#   Infrastrutture CMBO · Fermate SFM CMBO · Tracciato linee ferroviarie CMBO · Tracciato strade provinciali CMBO\n```\n\nIl dettaglio di un record dà anche il punto di contatto per chiedere aggiornamenti\no il riuso:\n\n```bash\nopenrndt get <id> | jq -r '._source | \"\\(.EnteResponsabile_s) | \\(.PuntoDiContattoEmail_s)\"'\n# Citta' metropolitana di Bologna | segreteria.pianificazione@cittametropolitana.bo.it\n```\n\nTrucco che fa la differenza: col solo bbox si prendono 2.789 record (molti\ndichiarano una bbox nazionale, rumore); aggiungendo `AmbitoTerritoriale_s:Locale`\ne una parola chiave del territorio si arriva a 4 record precisi.\n\nQui la ricerca è per territorio e non per ente perché il Comune di Bologna non\npubblica in proprio: `openrndt search --org \"comune di bologna\"` dà 0 e ti indica\nchi pubblica davvero (`Citta' metropolitana di Bologna`, `Regione\nEmilia-Romagna`). Dove l'ente c'è, `--org` è la via diretta: `openrndt search\n--org \"comune di torino\"` → 269 record.\n\n### 9. Solo open data: 268 dataset sulle frane, con licenza\n\n```bash\nopenrndt --format compact search --q \"frane AND isOpendata:*\" --num 10\n# total: 268 (2026-08-09) — inventari IFFI, rilievi post-alluvione 2023, pericolosità…\n```\n\nPer una licenza specifica si filtra sul valore: `--q 'frane AND isOpendata:\"CC BY 4.0\"'`.\nIl dettaglio del record riporta la licenza esatta in `isOpendata` e\n`apiso_AccessConstraints_s`.\n\n### 10. Dati, licenza e citazione della fonte per un articolo\n\n> ISPRA pubblica \"Popolazione a rischio alluvioni\" con licenza CC-BY-4.0:\n> riutilizzabile citando la fonte.\n\n```bash\nopenrndt get ispra_rm:01IdroHazard_DT | jq \\\n  '{licenza: ._source.isOpendata, ente: ._source.EnteResponsabile_s, email: ._source.PuntoDiContattoEmail_s}'\n# licenza: \"Dato concesso con licenza CC-BY-4.0\"\n# ente:    Istituto Superiore per la Protezione e la Ricerca Ambientale\n# email:   sinaservice@isprambiente.it\n```\n\nCitazione d'esempio: *\"Fonte: ISPRA — Popolazione a rischio alluvioni, CC-BY 4.0\"*.\nI dati sono esposti come WFS su `sdi.isprambiente.it` e si scaricano con\n`ogr2ogr` come nell'esempio 1.\n\n### 11. Il catalogo sulla mappa: footprint in GeoJSON\n\n> Vedi a colpo d'occhio quali dataset coprono la tua area, direttamente in QGIS.\n\n```bash\nopenrndt footprints --q \"frane AND isOpendata:*\" --num 268 > frane_footprints.geojson\n```\n\n`footprints` esporta una `FeatureCollection` EPSG:4326 con le bbox dei record\n(id, title, org, type, resources): trascina il file in QGIS e ogni poligono è\nun dataset, con i dati essenziali negli attributi.\n\n## Uso come libreria Python\n\n```python\nfrom openrndt import search, get_item, item_record, get_item_xml, ItemNotFoundError\n\n# Ricerca\nresults = search(q=\"catasto\", num=5)\nfor r in results[\"results\"]:\n    print(r[\"id\"], r[\"title\"])\n\n# Filtro per categoria e bbox\nresults = search(data_category=\"planningCadastre\", bbox=\"7,44,8,45\", num=10)\n\n# Dettaglio singolo metadato: get_item dà la busta Elasticsearch grezza,\n# item_record il documento normalizzato (lo stesso che stampa la CLI)\nitem = get_item(\"age:D_E973_MARSAGLIA\")\nrecord = item_record(item)\nprint(record[\"title\"], record[\"data_date\"], record[\"contact\"][\"email\"])\nfor r in record[\"resources\"]:\n    print(r[\"type\"], r[\"url\"])\n\n# XML ISO 19139\nxml = get_item_xml(\"age:D_E973_MARSAGLIA\")\n\n# Gestione ID inesistente\ntry:\n    item = get_item(\"id_inesistente\")\nexcept ItemNotFoundError:\n    print(\"metadato non trovato\")\n```\n\nSono esposti anche i mattoni del documento: `contact_point`, `download_urls` e\n`bbox_from_envelope` lavorano direttamente su un `_source`, e `compact_results`,\n`record_dates`, `record_license`, `record_url`, `organization_names` sulle\nrisposte di `search`.\n\nLe funzioni propagano le eccezioni `httpx`: `httpx.HTTPStatusError` per le\nrisposte 4xx/5xx e `httpx.ConnectError` / `httpx.TimeoutException` per i\nproblemi di rete. I retry interni coprono i timeout e i 5xx (3 tentativi),\nmentre gli errori di connessione/DNS (`ConnectError`) vengono propagati subito.\nTutte derivano da `httpx.HTTPError`, comodo per catturarle insieme:\n\n```python\nimport httpx\nfrom openrndt import search\n\ntry:\n    results = search(q=\"catasto\")\nexcept httpx.HTTPError as exc:\n    print(f\"richiesta fallita: {exc}\")\n```\n\nIl base URL è configurabile via variabile d'ambiente o parametro:\n\n```python\nfrom openrndt.config import set_base_url\nset_base_url(\"https://mio-mirror.example.com/RNDT\")\n```\n\n## Per agenti AI\n\nL'utente primario di questa CLI è un agente che legge `stdout` e compone i comandi\npasso passo. Da qui i principi di design (sul modello di\n[opensdmx](https://github.com/ondata/opensdmx)):\n\n- **Output strutturato, mai oggetti Python.** Default JSON su `stdout`; `--format\n  table` per la lettura umana, `--format csv` per i risultati tabellari, `--format\n  compact` (NDJSON, una riga per record) per scremare molti risultati a basso costo.\n- **In modalità JSON, `stdout` contiene solo JSON.** Errori e avvisi vanno su\n  `stderr`: si può fare pipe diretta in `jq`.\n- **Errori leggibili e self-contained: mai stack trace.** Un errore di rete o HTTP\n  produce un messaggio comprensibile su `stderr` ed exit code `1`, non un traceback.\n- **Exit code chiari.** `0` successo, `1` errore (rete, HTTP, ID inesistente),\n  `2` parametri non validi.\n- **Niente formati ambigui.** `get <id> --format csv` (dettaglio non tabellare)\n  fallisce con un messaggio esplicito invece di restituire output vuoto.\n\n### La skill `rndt-explorer` — esplorazione guidata\n\nIl repo include una **Agent Skill** per Claude Code:\n[`skills/rndt-explorer/`](https://github.com/ondata/openrndt/blob/main/skills/rndt-explorer/SKILL.md). Guida l'agente\nattraverso 4 fasi: scoperta delle codelist (offline), ricerca con filtri\nprogressivi, lettura del dettaglio, individuazione delle risorse scaricabili\n(WMS, WFS, download diretto). Include workflow pronti e verificati per casi\nd'uso reali — dall'operatore GIS che vuole un layer per QGIS al data journalist\nche deve scaricare i dati, verificarne la licenza e citare la fonte.\n\n**Installazione** (dopo aver installato la CLI):\n\n```bash\ngit clone https://github.com/ondata/openrndt.git\nmkdir -p ~/.claude/skills\ncp -r openrndt/skills/rndt-explorer ~/.claude/skills/\n```\n\nDa quel momento Claude Code attiva la skill da solo quando chiedi dati\nterritoriali italiani — «mi serve il catasto della mia zona», «trova un WMS\ncon le ortofoto della Sardegna» — senza che tu debba nominarla.\n\n## Riferimenti\n\n- Pagina ufficiale REST API: <https://geodati.gov.it/geoportale/eng/strumenti-en/rest-api>\n- Spec completa (sito di test Esri Geoportal Server, non produzione): <https://gpt.geocloud.com/geoportal3/api/gpt_api.json>\n- Documentazione raccolta nella cartella [`ref/`](https://github.com/ondata/openrndt/tree/main/ref).\n\n## Licenza\n\nMIT.",
  "bytes": 21784,
  "sha": "718d8bc55b05b62e7e9c92f4c1d7544e17fe5d8af1a73162f82aa15219a9dcb8",
  "repo_slug": "ondata/openrndt",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/okf_ondata_openrndt_knowledge_index_md_4e9ca211/readme"
}