# André — Analyse électorale française

> Résultats des élections françaises 1999-2026 par bureau de vote, socio-démo INSEE et cartes.

- name: vote.andre/elections
- version: 1.28.1
- connection class: R0 (autonomous)
- trust: 92/100
- quality: 88/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/vote.andre%2Felections
- tools: https://api.protogrid.dev/v1/servers/vote.andre%2Felections/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "elections": {
      "type": "http",
      "url": "https://mcp.andre.vote/mcp"
    }
  }
}
```


## Trust

- hygiene: 100
- liveness: 99
- freshness: 85
- provenance: 85
- drivers: +repository +dns-namespace +website +reachable +uptime-97% ~updated-76d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 88/100 (good)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 93 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 2 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 11 of 11 tools declare readOnlyHint or destructiveHint
- pass `tools.directory_hints`: every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
- pass `tools.token_cost`: about 4,565 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: no tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 11, about 4,565 tokens to load them all
- tool set hash: 49a2b7edc48e9beb7a27bd435eb612e7
- badge: [![protogrid quality](https://protogrid.dev/badge/vote.andre/elections.svg)](https://protogrid.dev/servers/vote.andre/elections)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

_No tool definition changes recorded._

## Remotes

- https://mcp.andre.vote/mcp (streamable-http, auth none, reachable true, uptime30d 0.974359)

## Packages

_none_

## Tools (11)

- `create_data_table`: Crée un tableau de données formaté à partir de données structurées.

        Utile pour présenter des résultats calculés ou combinés.
        Retourne un tableau texte formaté.
        
- `export_data`: Exporte des données électorales vers un fichier téléchargeable (CSV, JSON, TSV).

        Deux modes : data (contenu inline) ou source_path (chemin vers fichier existant).
        
- `generate_map`: Génère une carte électorale (PNG) pour une élection.

        Paramètres :
        - election_id : identifiant élection (ex: '2024_legi_t1', '2020_muni_t2')
        - metric : 'family' (famille politique en tête) ou 'nuance' (score d'une nuance)
        - geography : 'bv' (bureau de vote, défaut) ou 'commune' (carte nationale)
        - department : code département (ex: '13'). Requis pour geography='bv' sauf si commune fourni.
        - commune : code commune (ex: '13055' pour Marseille). Centre la carte sur cette commune.
        - nuance : code nuance quand metric='nuance' (ex: 'RN', 'LFI', 'ENS')
        - region : code région pour geography='commune' (ex: '93' pour PACA)

        Exemples :
        - Carte par famille, Bouches-du-Rhône : election_id='2024_legi_t1', department='13'
        - Carte score RN, Marseille : election_id='2024_legi_t1', commune='13055', metric='nuance', nuance='RN'
        - Carte nationale : election_id='2024_euro_t1', geography='commune'
        
- `query_admin`: Requête les divisions administratives françaises.

        Actions : search_commune, get_commune, search_postal,
        list_epci, get_epci, list_cantons, list_departements, list_regions.
        
- `query_dlp`: Requête les données DLP (composition sociale des candidats municipaux 2020).

        ~546 000 candidats dans ~10 000 communes (≥1 000 hab.).
        Classes : CDOM (dominant), CMOY (moyen), CSUB (subalterne), RET (retraité), AUTRES.
        Actions : summary, composition, parite, listes, candidats, professions, sortants.
        
- `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.
        
- `query_elus`: Requête les élus de la République française (base BRÉF).

        Actions : search_elu, list_mandate_types, list_elus.
        
- `query_sociodem`: Requête les données socio-démographiques au niveau bureau de vote.

        Données INSEE RP 2022 + Filosofi 2021, interpolées IRIS→BDV.
        Actions : list_variables, profile, indices, rank, compare.
        
- `query_sql`: Exécute une requête SQL directe sur la base DuckDB (read-only).

        Tables principales :
        - general_results : résultats généraux par bureau de vote
        - candidats_results : résultats par candidat par bureau de vote
        - elections_disponibles : liste des élections (id_election, nb_bureaux, total_inscrits)
        - candidats_avec_nuances : candidats avec famille politique (si nuances enrichies)
        - resultats_par_famille : résultats agrégés par famille politique
        - communes, epci, departements, regions : divisions administratives
        - bv_sociodemographique : données socio-démo par bureau de vote

        ATTENTION — colonnes de general_results (noms avec espaces, à quoter) :
        id_election, id_brut_miom, "Code du département", "Code de la commune" (SANS préfixe dept, ex: '055' pour Marseille),
        "Libellé de la commune", Inscrits, Abstentions, Votants, Blancs, Nuls, Exprimés.

        PRÉFÉRER query_elections pour les analyses standard — query_sql est pour les requêtes ad hoc avancées.

        Exemple :
        SELECT id_election, ROUND(100.0 * SUM(Abstentions) / NULLIF(SUM(Inscrits), 0), 1) as abstention_pct
        FROM general_results WHERE "Code du département" = '13' AND "Code de la commune" = '055'
        GROUP BY id_election ORDER BY id_election DESC LIMIT 5
        
- `simulate_fusions`: Simule les scénarios de fusion de listes municipales entre T1 et T2.

        Actions : 'status' (classer les listes après T1), 'simulate' (projections T2).
        Uniquement pour les élections municipales.
        
- `visualize`: Crée une visualisation Plotly (retourne le spec JSON).

        Deux modes :
        - Spec libre : fournir 'spec' (dict Plotly complet {data, layout})
        - Assisté : fournir chart_type + data + mappings

        Types supportés : bar, line, scatter, histogram, box, violin, heatmap,
        treemap, grouped_bar, stacked_bar, dumbbell, diverging_bar,
        dual_axis (x + y + y2), sankey (source + target + values),
        hemicycle (x=groupe, y=sièges), ternary (a + b + c = trois parts).
        Paramètres transversaux : subtitle (sous-titre technique),
        reference_line ({value, label, orientation}) pour un seuil/référence.
        
