Skip to content

fix(mcp-sparql): supporta endpoint Virtuoso (dati.camera.it) — usa execute_sparql() al posto di SparqlSource.fetch()#409

Merged
Gabrymi93 merged 2 commits into
mainfrom
fix/sparql-mcp-virtuoso-accept
Jun 29, 2026
Merged

fix(mcp-sparql): supporta endpoint Virtuoso (dati.camera.it) — usa execute_sparql() al posto di SparqlSource.fetch()#409
Gabrymi93 merged 2 commits into
mainfrom
fix/sparql-mcp-virtuoso-accept

Conversation

@Gabrymi93

Copy link
Copy Markdown
Member

Problema

Il tool MCP toolkit_sparql_query falliva su endpoint SPARQL Virtuoso che non riconoscono Accept: text/csv (es. dati.camera.it). Il server rispondeva con RDF/XML, non parsabile da SparqlSource._parse_response().

Causa

mcp_sparql_query() usava SparqlSource.fetch(accept_format="csv"), che invia richieste con Accept: text/csv,text/plain;q=0.5. Su Virtuoso (es. Camera dei Deputati) questo header non viene riconosciuto come formato SPARQL results valido → risposta in RDF/XML → DownloadError.

Fix

Sostituito SparqlSource.fetch() con execute_sparql() di lab_connectors.http.sparql, che:

  • Usa Accept: application/sparql-results+json,application/json — riconosciuto da Virtuoso
  • Ha parser fallback per SPARQL Results XML
  • È già il client SPARQL standard del Lab (usato da SO, scout, pipeline)

File modificato: toolkit/mcp/scout_ops.py

Test

Endpoint Query Risultato
dati.cultura.gov.it SELECT ?g COUNT(*) ... GROUP BY ?g LIMIT 3 ✅ 700M triple
dati.camera.it SELECT ?g COUNT(*) ... GROUP BY ?g LIMIT 3 ✅ 309M triple (PRIMA: RDF/XML non parsabile)
dati.camera.it Query DCAT inventory (custom) ✅ 5 dataset

Suite: 18/18 toolkit · 309/309 lab-connectors

Impatto downstream

Nessuno — il contratto pubblico del tool MCP (toolkit_sparql_query) è invariato: stessi parametri input, stesso formato output.

Note

dati.cultura.gov.it era un falso allarme (lendpoint funziona già, linventory SO era fallito per timeout transiente).

…per supportare endpoint Virtuoso

Il tool MCP toolkit_sparql_query usava SparqlSource.fetch() con
accept_format='csv', che invia Accept: text/csv. Su endpoint Virtuoso
(es. dati.camera.it) questo header non viene riconosciuto e il server
restituisce RDF/XML, che SparqlSource._parse_response() non supporta.

Sostituito con execute_sparql() di lab-connectors, che usa
Accept: application/sparql-results+json,application/json (riconosciuto
da Virtuoso) e ha parser XML fallback per SPARQL Results XML.
@Gabrymi93 Gabrymi93 merged commit edcd878 into main Jun 29, 2026
3 checks passed
@Gabrymi93 Gabrymi93 deleted the fix/sparql-mcp-virtuoso-accept branch June 29, 2026 13:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant