| name | italian-parliament-mcp |
| description | Query Italian Parliament open data (Camera dei Deputati and Senato della Repubblica) via MCP tools. Use when a user asks about Italian MPs, bills, votes, speeches, parliamentary groups, government members, or oversight acts. Designed for conversational use in Claude Desktop or Claude Code with the italianparliament-mcp server configured. |
| compatibility | Requires italianparliament-mcp MCP server configured in Claude Desktop or Claude Code |
| metadata | {"author":"aborruso","version":"1.3"} |
Italian Parliament MCP Skill
Query Italian Parliament open data through the italianparliament-mcp MCP server.
When to use
Activate this skill when the user asks questions like:
- "Quanti deputati ha il gruppo FDI?"
- "Chi ha fatto più interrogazioni in questa legislatura?"
- "Come ha votato X nella seduta Y?"
- "Quali leggi ha proposto il governo Meloni?"
Available tools
See tool reference for the full list with parameters and examples.
Workflow
1. Identify the right tool
| User intent | Tool |
|---|
| Cerca un parlamentare per nome | search |
| Scheda deputato | deputy |
| Scheda senatore | senator |
| Carriera persona (legislature + governo) | person-career |
| Risolvi URI persona → nome (batch, Camera+Senato) | people |
| Lista deputati/senatori | deputies / senators |
| Gruppi parlamentari Camera | groups / group-members |
| Gruppi parlamentari Senato | senato-groups / senator-group-members |
| Disegni di legge Camera | bills / bill |
Iter DDL (Camera con uri, Senato lista/ddlUri) | bill-progress |
Firmatari di un DDL (Camera o Senato, billUri) | bill-signatories |
| Testo integrale di un DDL (articolato) | bill-text |
| DDL di un parlamentare come primo firmatario | member-bills |
| Relatori di un DDL (Camera o Senato) | bill-rapporteurs |
| Membri di una commissione Senato | committee-members |
| Sedute di commissione su un DDL Senato, o attività di una commissione (Camera+Senato) | committee-sessions |
| Audizioni delle commissioni (solo Camera) | audizioni |
| Interrogazioni, interpellanze, mozioni | aic (Camera e Senato, filtro chamber) / sindacato-ispettivo (repertorio Senato) |
| Interrogazioni del Senato per argomento | aic con keyword (+ chamber: "senato"), non sindacato-ispettivo |
| Votazioni Camera | votes / vote-detail |
| Votazioni Senato | senato-votes / senato-vote-detail |
| Presenze/assenze aggregate di un parlamentare per legislatura | attendance (Camera) / senato-attendance (Senato) |
| Interventi in aula | speeches |
| Emendamenti Senato | amendments |
| Emendamenti Camera (proposte emendative) | camera-amendments |
| Documenti parlamentari Senato | documents |
| Governi e ministri | governments / gov-members |
| Legislature | legislatures |
| Commissioni Camera e Senato | committees |
| Incarichi parlamentari Camera | roles |
| Sedute Camera | sessions |
| Query SPARQL libera | sparql |
| Ranking attività parlamentare | rank (persone) / group-rank (gruppi) |
2. Default legislature
The current legislature is 19 (XIX). Use it as default when the user does not specify.
3. Handle ambiguous names
Use search first to resolve a name to a URI before calling deputy or senator.
4. Keyword search: use the formal term
keyword filters (on bills, aic, committee-sessions, …) do a literal match on the act's formal title, not a semantic search. Journalistic wording rarely matches the legal wording, so an empty result is almost always a lexical mismatch, not missing data.
- Use the normative term:
elezione not elettorale; disabilità/portatori di handicap not fuorisede.
- Decree-law conversions: search by decree number. The formal title always starts with «Conversione in legge del decreto-legge , n. …», so the number (e.g.
keyword: "127", ideally with a date range around the presentation) is a more reliable hook than any thematic synonym — the journalistic name of the measure ("riforma della Maturità") often never appears in the title.
- Try several synonyms and word roots (e.g.
elett → elettorale/elettori, elez → elezione/elezioni — note: plural elezioni won't match a title with singular elezione, but the root does) before concluding. An empty result ≠ absent data — reformulate 2-3 times first.
sindacato-ispettivo (Senato) is not searchable by topic, but aic is — for Senato acts too. The Senato LOD exposes no subject/text for these acts (only type, number, date, signatories), so don't promise thematic searches on that tool. The way in is aic: the Camera dataset publishes ~160,000 Senato sindacato ispettivo acts (URIs ending in _S) with the full text in description, so aic --keyword <topic> --chamber senato answers "what did senators ask about X". Don't answer "not searchable" any more — search there. Caveat: an absence in aic doesn't prove the Senato act doesn't exist (the two sets aren't perfectly aligned), and in leg. 17 the 4.5% of acts without ocd:ramo fall outside the chamber filter.
audizioni --committeeName is literal: it matches a substring against the official rdfs:label of the committee, which is the full formal name. "Covid" finds nothing — use "emergenza sanitaria" or "SARS-CoV-2". If a lookup returns empty, first inspect the actual labels with committees list --chamber camera + grep, then retry with the exact name.
- Question time by venue (
aic): type also matches the act's label, and the venue is regular in the label, so no dedicated field is needed. aic --type "immediata in assemblea" = question time in Aula; aic --type "immediata in commissione" = in committee (combine with for a topic).
5. Two different failures, one 403 (Senato only)
The Senato endpoint accepts a request up to 2047 bytes of URL and rejects longer ones, but answers 403 both in that case and when requests come too close together — with an identical error page. Tell them apart, because the right reaction is the opposite:
- Error message "Query troppo lunga per l'endpoint del Senato" (raised before going out to the network): shorten the
keyword — a short root is enough, the match is by substring — or narrow the date range. Retrying the same call is pointless.
- A bare
403 from the endpoint: too many requests in a short time. Wait a few minutes; do not retry in a burst. The server already spaces its own Senato calls by 2s — the block comes from several tool calls stacking up.
This limit is Senato only: the Camera endpoint accepts far larger requests. Never report either failure to the user as "the data is not available": nothing has been proven about the data.
6. Output format
Tools return CSV or JSONL. For display, format results as markdown tables. For analysis, summarize key figures.
Common patterns
Find and profile an MP
search with the name → get URI
deputy or senator with the URI
Ranking by activity
Use rank with rankBy: aic-primo-firmatario, aic-cofirmatario, bills-primo-firmatario, bills-cofirmatario, speeches, sindacato-ispettivo, ddl-senato.
Group composition (Camera)
groups → get group URI
group-members with the URI and legislature
Group composition (Senato)
senato-groups → get list with sigla and member count, pick group URI
senator-group-members with the URI and legislature
Who voted how (Camera)
votes → get vote URI
vote-detail with the URI
- Secret ballot — a secret vote is secret, in any chamber or context: by definition the individual choice is never recorded at the source, so never infer or invent how someone voted on a secret ballot; report "scelta individuale non registrata (scrutinio segreto)". How it surfaces on Camera (
secret_vote=true): vote-detail shows in vote only Ha votato / Non ha votato / Astensione, never Favorevole/Contrario (a normal vote has Favorevole/Contrario). Same principle at the Senato (type=segreta, see below), where it surfaces as presence-only rows.
Who voted how (Senato)
senato-votes → get vote URI (filter by ddlUri for votes on a bill, or by date)
senato-vote-detail with the URI. Each row includes the senator's group_label at the vote date, so the group breakdown comes directly (no need to cross-reference).
- When is the individual choice available? Only for merit votes (
type from senato-votes = elettronica, nominale con appello, controprova). For segreta (secret ballot) and verifica numero legale (quorum count) the source does not record the individual choice — senato-vote-detail returns only presence rows (Presente non votante, In congedo/missione), never an expressed choice (neither Favorevole, nor Contrario, nor Astenuto). That's correct: report "scelta individuale non registrata (voto segreto / verifica del numero legale)", don't infer the vote on those two types.
Iter completo di una legge (Camera → Senato → pubblicazione)
Non generare la timeline a memoria: costruiscila dai tool, passo per passo. bill-progress è la spina dorsale.
bills con keyword → individua l'atto Camera (URI, es. ac19_2911).
bill-progress con uri = atto Camera → iter con le date reali di ogni fase (assegnazione, esame in commissione, approvazione/trasmissione, approvazione definitiva, legge).
- Aggancia il ramo Senato con
bill-progress + number + branch: S. Attenzione: il numero non si conserva tra i rami (C.2669 → S.1924), quindi il numero Camera non è il numero Senato. Due esiti possibili, entrambi gestiti: se non esiste un S.<numero>, il tool risale da sé all'osr:idDdl e restituisce tutte le fasi del DDL nei due rami (è quello che vuoi, e ti dà il ddlUri della fase Senato); se invece un S.<numero> esiste, ricordati che può essere un atto completamente diverso (S.1511 ≠ fase Senato di C.1511) — controlla che il titolo sia lo stesso prima di usarlo, o cercalo per titolo con keyword.
- Voti: Senato
senato-votes con ddlUri (+ caveat fiducia sotto). Camera: parti da votes + billCode, non da keyword — prende voto finale, fiducia, ordini del giorno ed emendamenti collegati all'atto nel grafo, che la ricerca per parola chiave manca (la descrizione di una votazione è spesso solo un codice, EM 1.1077). Tre avvertenze: è il numero dell'atto Camera, non quello del decreto-legge (il DL 100/2026 è il C.3053), quindi parti dall'atto trovato al punto 1; il numero base copre le varianti (2790 → 2790-bis); e un risultato pieno non è per forza completo — restano fuori i voti a codice secco delle sedute in cui la fonte non ha popolato il riferimento all'atto, cosa che capita a sedute intere e sui provvedimenti più contesi (C.2822, legge elettorale: billCode dà 28 votazioni, le 12 della seduta del 14/7/2026 col famoso 188-187 sulle preferenze non ci sono). Su un esame in Aula lungo, incrocia sempre con l'intervallo di date letto da bill-progress e leggi vote-detail, invece di dedurre il conteggio.
- Contenuto:
bill-text — il testo non è nei metadati; se non lo recuperi, non descrivere il contenuto della legge.
Obiettivi giornalistici derivabili senza tool dedicato
Alcune analisi ricorrenti (es. i dissidenti/ribelli che votano contro la linea del proprio gruppo) non hanno un tool dedicato ma si ricavano combinando i tool esistenti. Vedi obiettivi giornalistici per le ricette (ingredienti, passi, scelte analitiche, limiti).
Confidence votes: at the source a fiducia has an empty ddlUri (the bill link is only in the label text, e.g. "Disegno di legge n.1933. Votazione questione di fiducia."), but senato-votes list --ddlUri <uri> now includes it anyway: it resolves the DDL's seduta dates and re-links the fiducia voted that day. Still verify ddlUri on any "final" vote found by date: it may belong to a different act (unified text).
Legislatura dedotta: audizioni (dalle date), senato-attendance (dalle legislature in cui il senatore ha voti) e senato-votes (dalle sedute dell'intervallo) non richiedono legislature: indicarla sbagliata è il modo tipico di ottenere un vuoto che sembra assenza di dato. In group-rank invece va indicata per le legislature passate, perché lì non c'è nulla da cui dedurla.
Legislatura in senato-votes: non passarla quando la ricerca è per data o per DDL — viene dedotta (dalle sedute dell'intervallo, o dal DDL), quindi una ricerca sul 9/12/2020 trova da sola la leg. 18. Va indicata solo se l'intervallo copre due legislature: in quel caso il tool si ferma e lo dice, perché lo stesso numero di DDL esiste in entrambe e i risultati non sarebbero confrontabili.
Read the actual text of a bill (articolato)
The full text is not in the SPARQL data — only metadata. bill-text returns the direct links to the text, each with a format (html/pdf/urn) and an auth field:
bill-text with the bill URI (http://dati.senato.it/ddl/<N> or a Camera atto URI) → list of resources.
auth=none (Camera): the orchestrator can fetch the page directly.
auth=browser (Senato): www.senato.it is behind AWS WAF, so a plain fetch returns HTTP 202. Either let a browser-capable orchestrator open the URL, or use the local CLI italianparliament bill-text fetch --did <N> which drives a real browser to clear the WAF, downloads the PDF, and converts it to markdown with lit. Use --which "Relazione" to pick a specific text, --all for every text, --fascicolo for the full iter dossier.
The did is the number <N> in the Senato DDL URI (dati.senato.it/ddl/<N>), same as ?did= in the scheda URL.
Grounding (non inventare)
Ricostruendo iter, voti o schede il rischio è la confabulazione su scheletro reale: partire da un dato corretto e riempire i buchi con valori plausibili ma falsi (voti, date, firmatari, contenuti). I tool restituiscono il dato giusto; il difetto nasce da come li si combina e interpreta. Regole:
- Riporta solo ciò che un tool ha restituito. Se un voto, un firmatario, una data o un contenuto non è nell'output, dì "non disponibile" — non completare con numeri o nomi verosimili.
- Un elenco che riempie
limit è tagliato: non presentarlo come completo. Quando succede, l'ultima riga della risposta non è un record JSON ma un avviso in chiaro (AVVISO: risultato troncato…). Gli elenchi sono ordinati per data decrescente, quindi su un filtro per intervallo a mancare sono i giorni più vecchi: non concludere che in quei giorni non sia successo nulla, e non contare le righe ricevute come se fossero il totale. Chiedi il totale vero con countOnly: true, poi alza limit (max 1000), pagina con offset o restringi le date. Su intervalli lunghi 1000 righe possono coprire un solo mese: aic sul 2025 sono 11.649 righe reali.
- Aggancia gli atti per identificatore, non per keyword — ma non trasportare il numero da un ramo all'altro. Per la fase Senato di un atto Camera usa
bill-progress con number + branch: S: se non esiste un DDL con quel numero al Senato il tool ti dà tutte le fasi del provvedimento (numerazione diversa, stesso idDdl). Non concludere mai "il Senato non ha ancora l'atto" da un vuoto su quel numero, e verifica il titolo quando un S.<numero> esiste: potrebbe essere un altro atto.
- Una navetta finisce su un altro atto: l'ultimo stato di quello di partenza non è lo stato attuale. Alla Camera la lettura successiva di un testo tornato modificato è un atto variante con suffisso (
C.703 → C.703-B). La timeline di C.703 si chiude con Approvato, segue Navette nel febbraio 2024, ma la legge è stata approvata definitivamente nel novembre 2025 su C.703-B. bill-progress sonda le varianti e le dichiara nell'avviso: finché quell'avviso compare, l'iter non è concluso — richiamalo con l'URI indicato prima di scrivere che un provvedimento è fermo o decaduto. -B/-C/-D sono letture successive, -A è il testo della commissione.
- Un vuoto con filtro di date ora è spiegato: leggilo. Sui tool Camera (
aic, votes), quando il risultato è vuoto e c'era un intervallo di date, l'avviso dice fino a quando quell'area di dati è stata caricata. Due letture opposte, da non confondere: "la finestra non è ancora coperta da un caricamento" = può essere dato non ancora pubblicato, verifica alla fonte e dire che non è avvenuto nulla; "la finestra è coperta" = il ritardo è escluso, la causa è nei filtri o è un'assenza strutturale, quindi non attribuirla alla latenza. Le aree hanno freschezze diverse (a fine luglio 2026: atti e interrogazioni al 28/07, votazioni al 24/07, sedute e interventi d'Aula fermi al 18/06), quindi lo stesso giorno può essere coperto per un tool e non per un altro. Il Senato non ha questo segnale.