{"name":"vote.andre/elections","slug":"andre-elections","title":"André — Analyse électorale française","description":"Résultats des élections françaises 1999-2026 par bureau de vote, socio-démo INSEE et cartes.","url":"https://mcp.market/server/andre-elections","rating":null,"grade":"B","score":73,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":23,"stars":0,"forks":0,"downloads_week":null,"last_push_at":"2026-09-03T11:23:33.000Z","license":"MIT"},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-04T11:10:42.343Z","last_ok_at":"2026-11-04T11:10:42.343Z","latency_ms":152},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/joelgombin/andre-mcp","website":"https://andre.vote","version":"1.28.1","remotes":[{"type":"streamable-http","url":"https://mcp.andre.vote/mcp"}],"packages":[],"tools":[{"name":"create_data_table","description":"Crée un tableau de données formaté à partir de données structurées.\n\n        Utile pour présenter des résultats calculés ou combinés.\n        Retourne un tableau texte formaté.\n        ","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"title":{"title":"Title","type":"string"},"columns":{"items":{"additionalProperties":true,"type":"object"},"title":"Columns","type":"array"},"rows":{"items":{"additionalProperties":true,"type":"object"},"title":"Rows","type":"array"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Description"}},"required":["title","columns","rows"],"title":"create_data_tableArguments"}},{"name":"export_data","description":"Exporte des données électorales vers un fichier téléchargeable (CSV, JSON, TSV).\n\n        Deux modes : data (contenu inline) ou source_path (chemin vers fichier existant).\n        ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"filename":{"title":"Filename","type":"string"},"file_format":{"default":"csv","title":"File Format","type":"string"},"data":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Data"},"source_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source Path"}},"required":["filename"],"title":"export_dataArguments"}},{"name":"generate_map","description":"Génère une carte électorale (PNG) pour une élection.\n\n        Paramètres :\n        - election_id : identifiant élection (ex: '2024_legi_t1', '2020_muni_t2')\n        - metric : 'family' (famille politique en tête) ou 'nuance' (score d'une nuance)\n        - geography : 'bv' (bureau de vote, défaut) ou 'commune' (carte nationale)\n        - department : code département (ex: '13'). Requis pour geography='bv' sauf si commune fourni.\n        - commune : code commune (ex: '13055' pour Marseille). Centre la carte sur cette commune.\n        - nuance : code nuance quand metric='nuance' (ex: 'RN', 'LFI', 'ENS')\n        - region : code région pour geography='commune' (ex: '93' pour PACA)\n\n        Exemples :\n        - Carte par famille, Bouches-du-Rhône : election_id='2024_legi_t1', department='13'\n        - Carte score RN, Marseille : election_id='2024_legi_t1', commune='13055', metric='nuance', nuance='RN'\n        - Carte nationale : election_id='2024_euro_t1', geography='commune'\n        ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"election_id":{"title":"Election Id","type":"string"},"metric":{"default":"family","title":"Metric","type":"string"},"geography":{"default":"bv","title":"Geography","type":"string"},"department":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Department"},"commune":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Commune"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Region"},"nuance":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Nuance"},"circonscription":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Circonscription"},"canton":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Canton"}},"required":["election_id"],"title":"generate_mapArguments"}},{"name":"query_admin","description":"Requête les divisions administratives françaises.\n\n        Actions : search_commune, get_commune, search_postal,\n        list_epci, get_epci, list_cantons, list_departements, list_regions.\n        ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"title":"Action","type":"string"},"search_term":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Search Term"},"commune_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Commune Code"},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Postal Code"},"departement_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Departement Code"},"epci_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Epci Code"}},"required":["action"],"title":"query_adminArguments"}},{"name":"query_dlp","description":"Requête les données DLP (composition sociale des candidats municipaux 2020).\n\n        ~546 000 candidats dans ~10 000 communes (≥1 000 hab.).\n        Classes : CDOM (dominant), CMOY (moyen), CSUB (subalterne), RET (retraité), AUTRES.\n        Actions : summary, composition, parite, listes, candidats, professions, sortants.\n        ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"title":"Action","type":"string"},"commune_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Commune Code"},"departement_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Departement Code"},"classe":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Classe"},"sexe":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Sexe"},"tetes_only":{"default":false,"title":"Tetes Only","type":"boolean"},"sortants_only":{"default":false,"title":"Sortants Only","type":"boolean"},"search":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Search"}},"required":["action"],"title":"query_dlpArguments"}},{"name":"query_elections","description":"Requête les données électorales françaises (1999-2026).\n\n        Niveaux territoriaux : NATIONAL (aucun filtre), RÉGIONAL (region_code),\n        DÉPARTEMENTAL (departement_code), COMMUNAL (commune_code).\n\n        Actions de base : list_elections, query_results, list_bureaux, query_bureau,\n        query_by_bureau, rank_bureaux, list_circonscriptions, query_circonscription,\n        list_cantons, query_canton, search_candidate, query_candidatures, etc.\n\n        Actions « panel » (1 appel = analyse complète, évite les boucles) :\n        - compare_elections : compare deux scrutins pour un territoire\n          (election_id + compare_to_election + commune_code|departement_code,\n          candidate_name optionnel).\n        - query_all_circonscriptions : vainqueur de CHAQUE circonscription d'un\n          territoire en un appel (election_id + commune_code|departement_code,\n          législatives uniquement).\n        - vote_reserve : score d'une famille + abstention par bureau de vote sur\n          les scrutins récents comparables (commune_code + famille).\n        - select_communes : sélectionne/classe des communes par critères géo +\n          population + électoraux (region_code/departement_code/epci/commune_codes,\n          population_min/max, commune_metric, condition, sort_by, limit, order ;\n          commune_metric/condition nécessitent election_id). commune_metric accepte\n          PLUSIEURS métriques séparées par des virgules — une colonne chacune, en\n          un seul appel ; condition et sort_by portent alors sur la première.\n        - cross_election_panel : évolution d'un sujet (famille ou nuance_code) par\n          commune sur N scrutins (elections=ids séparés par des virgules + scope\n          optionnel commune_code/departement_code/region_code/commune_codes ;\n          SANS scope = national, panel complet en data_file). Renvoie aussi\n          « ensemble » : score du périmètre entier par scrutin + delta, pondéré\n          par les exprimés — ne pas boucler par département. famille et nuance_code\n          acceptent PLUSIEURS sujets séparés par des virgules ('Gauche,Droite') :\n          tous en un appel, agrégats dans « ensembles ». group_by='region'|\n          'departement' ajoute un agrégat pondéré PAR MAILLE dans le même appel —\n          ne jamais boucler un appel par région.\n        - bureau_breakdown : pivot par bureau (top_n nuances/blocs + participation,\n          with_sociodem optionnel) pour commune_code + election_id.\n        ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"title":"Action","type":"string"},"election_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Election Id"},"commune_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Commune Code"},"departement_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Departement Code"},"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Region Code"},"bureau_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Bureau Id"},"bureau_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Bureau Code"},"candidate_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Candidate Name"},"family_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Family Name"},"by_family":{"default":false,"title":"By Family","type":"boolean"},"rank_metric":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Rank Metric"},"order":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Order"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Limit"},"offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Offset"},"use_ferd_coding":{"default":false,"title":"Use Ferd Coding","type":"boolean"},"nuance_level":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Nuance Level"},"circonscription_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Circonscription Code"},"canton_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Canton Code"},"candidate_query":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Candidate Query"},"candidate_search":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Candidate Search"},"list_search":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"List Search"},"nuance_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Nuance Code"},"scrutin_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Scrutin Type"},"tour":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Tour"},"compare_to_election":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Compare To Election"},"famille":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Famille"},"elections":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Elections"},"commune_codes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Commune Codes"},"epci":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Epci"},"population_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Population Min"},"population_max":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Population Max"},"commune_metric":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Commune Metric"},"group_by":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Group By"},"condition":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Condition"},"sort_by":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Sort By"},"top_n":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Top N"},"with_sociodem":{"default":false,"title":"With Sociodem","type":"boolean"}},"required":["action"],"title":"query_electionsArguments"}},{"name":"query_elus","description":"Requête les élus de la République française (base BRÉF).\n\n        Actions : search_elu, list_mandate_types, list_elus.\n        ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"title":"Action","type":"string"},"search_term":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Search Term"},"mandate_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Mandate Type"},"departement_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Departement Code"}},"required":["action"],"title":"query_elusArguments"}},{"name":"query_sociodem","description":"Requête les données socio-démographiques au niveau bureau de vote.\n\n        Données INSEE RP 2022 + Filosofi 2021, interpolées IRIS→BDV.\n        Actions : list_variables, profile, indices, rank, compare.\n        ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"title":"Action","type":"string"},"commune_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Commune Code"},"variable":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Variable"},"commune_codes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Commune Codes"},"order":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Order"}},"required":["action"],"title":"query_sociodemArguments"}},{"name":"query_sql","description":"Exécute une requête SQL directe sur la base DuckDB (read-only).\n\n        Tables principales :\n        - general_results : résultats généraux par bureau de vote\n        - candidats_results : résultats par candidat par bureau de vote\n        - elections_disponibles : liste des élections (id_election, nb_bureaux, total_inscrits)\n        - candidats_avec_nuances : candidats avec famille politique (si nuances enrichies)\n        - resultats_par_famille : résultats agrégés par famille politique\n        - communes, epci, departements, regions : divisions administratives\n        - bv_sociodemographique : données socio-démo par bureau de vote\n\n        ATTENTION — colonnes de general_results (noms avec espaces, à quoter) :\n        id_election, id_brut_miom, \"Code du département\", \"Code de la commune\" (SANS préfixe dept, ex: '055' pour Marseille),\n        \"Libellé de la commune\", Inscrits, Abstentions, Votants, Blancs, Nuls, Exprimés.\n\n        PRÉFÉRER query_elections pour les analyses standard — query_sql est pour les requêtes ad hoc avancées.\n\n        Exemple :\n        SELECT id_election, ROUND(100.0 * SUM(Abstentions) / NULLIF(SUM(Inscrits), 0), 1) as abstention_pct\n        FROM general_results WHERE \"Code du département\" = '13' AND \"Code de la commune\" = '055'\n        GROUP BY id_election ORDER BY id_election DESC LIMIT 5\n        ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"title":"Query","type":"string"}},"required":["query"],"title":"query_sqlArguments"}},{"name":"simulate_fusions","description":"Simule les scénarios de fusion de listes municipales entre T1 et T2.\n\n        Actions : 'status' (classer les listes après T1), 'simulate' (projections T2).\n        Uniquement pour les élections municipales.\n        ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"title":"Action","type":"string"},"election_id":{"title":"Election Id","type":"string"},"commune_code":{"title":"Commune Code","type":"string"},"report_rate":{"default":0.75,"title":"Report Rate","type":"number"}},"required":["action","election_id","commune_code"],"title":"simulate_fusionsArguments"}},{"name":"visualize","description":"Crée une visualisation Plotly (retourne le spec JSON).\n\n        Deux modes :\n        - Spec libre : fournir 'spec' (dict Plotly complet {data, layout})\n        - Assisté : fournir chart_type + data + mappings\n\n        Types supportés : bar, line, scatter, histogram, box, violin, heatmap,\n        treemap, grouped_bar, stacked_bar, dumbbell, diverging_bar,\n        dual_axis (x + y + y2), sankey (source + target + values),\n        hemicycle (x=groupe, y=sièges), ternary (a + b + c = trois parts).\n        Paramètres transversaux : subtitle (sous-titre technique),\n        reference_line ({value, label, orientation}) pour un seuil/référence.\n        ","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"chart_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Chart Type"},"data":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"default":null,"title":"Data"},"data_file":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Data File"},"spec":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Spec"},"x":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"X"},"y":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Y"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Color"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Title"},"subtitle":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Subtitle"},"y2":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Y2"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Source"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Target"},"values":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Values"},"z":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Z"},"path":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Path"},"a":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"A"},"b":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"B"},"c":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"C"},"size":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Size"},"reference_line":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Reference Line"}},"title":"visualizeArguments"}}],"scan":{"score":73,"grade":"B","scanned_at":"2026-09-24T21:42:35.587Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-24T21:42:35.584Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":17,"max":20,"notes":["remote reachable in 2067ms"]},"poisoning":{"score":13,"max":15,"notes":["11 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 1 write-action tools with no auth"]},"maintenance":{"score":15,"max":15,"notes":["last push 21 days ago"]},"identity":{"score":7,"max":10,"notes":["namespace and repository owner differ","GitHub account older than a year","website matches verified namespace"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"},{"id":"poison.long-description","severity":"low","component":"poisoning","title":"Unusually long tool description (over 2,000 characters)","evidence":"tool query_elections: …Requête les données électorales françaises (1999-2026). Niveaux territoriaux : NATIONAL (aucun filtre), RÉGIONAL (region_code), DÉPARTEMENTAL (departement_code), COMMUNAL (commune_code). Actions de base : list_elections, query_results, list_bureaux, query_bureau, query_by_bureau, rank_bureaux, list_circonscriptions, query_circonscription, list_cantons, query_canton, search_candidate, query_candidatures, etc. Actions « panel » (1 appel = analyse complète, évite les boucles) : - compare_elections : compare deux scrutins pour un territoire (election_id + compare_to_election + commune_code|departement_code, candidate_name optionnel). - query_all_circonscriptions : vainqueur de CHAQUE circonscription d'un territoire en un appel (election_id + commune_code|departement_code, législatives uniquement). - vote_reserve : score d'une famille + abstention par bureau de vote sur les scrutins récents comparables (commune_code + famille). - select_communes : sélectionne/classe des communes par critères géo + population + électoraux (region_code/departement_code/epci/commune_codes, population_min/max, commune_metric, condition, sort_by, limit, order ; commune_metric/condition nécessitent election_id). commune_metric accepte PLUSIEURS métriques séparées par des virgules — une colonne chacune, en un seul appel ; condition et sort_by portent alors sur la première. - cross_election_panel : évolution d'un sujet (famille ou nuance_code) par commune sur N scrutins (elections=ids séparés par des virgules + scope optionnel commune_code/departement_code/region_code/commune_codes ; SANS scope = national, panel complet en data_file). Renvoie aussi « ensemble » : score du périmètre entier par scrutin + delta, pondéré par les exprimés — ne pas boucler par département. famille et nuance_code acceptent PLUSIEURS sujets séparés par des virgules ('Gauche,Droite') : tous en un appel, agrégats dans « ensembles ». group_by='region'| 'departement' ajoute un agrégat pondéré PAR MAILLE dans le même appel — ne jamais boucler un appel par région. - bureau_breakdown : pivot par bureau (top_n nuances/blocs + participation, with_sociodem optionnel) pour commune_code + election_id. …"}],"inputs":{"probes":[{"url":"https://mcp.andre.vote/mcp","reachable":true,"authRequired":false,"latencyMs":2067,"serverInfo":{"name":"andré","version":"1.26.0"}}],"packages":[],"repo":{"found":true,"owner":"joelgombin","repo":"andre-mcp","archived":false,"pushedAt":"2026-09-03T11:23:33Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/1918735?v=4","ownerCreatedAt":"2012-07-03T15:44:10Z","license":"MIT"},"icon":{"url":"https://andre.vote/icon-512.png","source":"registry","width":512,"height":268},"presence":{"stars":0,"forks":0,"downloadsWeek":null,"license":"MIT","lastPushAt":"2026-09-03T11:23:33.000Z","score":23}}}},"grade_history":[],"reviews":[]}